কেন আমরা ক্লোজুরে নেস্টেড শর্টহ্যান্ড ফাংশন লিখতে পারি না?


11

আমি আজ নেস্টেড শর্টহ্যান্ড ফাংশনগুলির সাথে ক্লোজারের অভিব্যক্তিটি মূল্যায়নের চেষ্টা করেছি এবং এটি আমাকে ছাড়তে দেবে না।

প্রকাশটি ছিল:

(#(+ % (#(+ % (* % %)) %)) 5) ; sorry for the eye bleed

আউটপুটটি ছিল:

IllegalStateException Nested #()s are not allowed  clojure.lang.LispReader$FnReader.invoke (LispReader.java:630)
...and a bunch of other garbage

2
আমি দেখতে পেয়েছি যে এই জাতীয় কোড লিখতে না পারা ক্লোজারের পক্ষে ভাল জিনিস।
সাইমন বার্গোট

3
কারণ এটি আপনার চোখকে রক্তক্ষরণ করে।
মাইকেল শ

আপনার কি দরকার (# (+% 1 (# (+% 2 (*% 3% 4))% 5)) 5)?
নতুনত্ব

উত্তর:


5

আপনি জানতে পারবেন যে% অন্তর্গত ফাংশনের সাথে সম্পর্কিত। অপূর্ণতাটি হ'ল আপনি বাহ্যিক ক্রিয়ায়% এর অ্যাক্সেস হারাবেন।

ব্যবহার করুন fn [x]পরিবর্তে সিনট্যাক্স।


1
তাই? বেশিরভাগ সময় আমার %কাছে বাইরের এফএন এর অ্যাক্সেসের প্রয়োজন হয় না , এবং আপনি যে সময়টি করেছিলেন, আপনি (fn)ঠিক পিছনে পড়ে যেতে পারেন ?
জাজ

10

এটি সম্পূর্ণ নির্বিচারে; পার্সারে কয়েকটি লাইন রয়েছে যা স্পষ্টতই এটি অক্ষম করে। আপনি যদি সেই লাইনটি সম্পাদনা করেন তবে আপনি অনামী ফাংশনগুলি নেস্ট করতে পারেন এবং তারা আপনার প্রত্যাশা মতোই কাজ করে।

বিশেষত, https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LispReader.java এ 634-635 লাইনগুলি

public static class FnReader extends AFn{
    public Object invoke(Object reader, Object lparen) {
        PushbackReader r = (PushbackReader) reader;
        if(ARG_ENV.deref() != null) // <-- line 634
            throw new IllegalStateException("Nested #()s are not allowed");
        // ...

আপনি কি পার্সারে রেখাটি চিহ্নিত করতে পারেন এবং প্রমাণ করতে পারবেন যে কোডটি অ্যান নেস্টেড ক্রিয়াকলাপ না করার জন্য পুনর্লিখন এবং পার্সার এবং আনন নেস্টেড ফাংশনটি সরিয়ে রেখার কোডটি একই কাজ করে?

2
@ মিশেলটি: আপনি সেখানে যান। এবং আপনি এটি পরীক্ষা করতে পারেন; আপনি রানটাইমে এগুলি স্যুইচ আউট করতে পারছেন তাই এটি করা সহজ। ক্লোজার পার্সারটি সত্যিই বেশ সহজে হ্যাকযোগ্য
আমারা

4
ঠিক আছে, সম্পূর্ণ স্বেচ্ছাচারী নয়; যদি না রিক হিকি কেবল একটি নির্বিচারে দিন কাটাত না, তবে অবশ্যই এটি একটি কারণ সেখানে রেখেছিল এবং আপনি কি মনে করেন না যে কারণটি কী। Duh।
রবার্ট হার্ভে

বাহ, কী সন্ধান! ভাল - +1।

এই পরিবর্তনটি কি নেস্টেড পদ্ধতিগুলির কোনও অস্পষ্ট পার্সিংয়ের কারণ হতে পারে? আমি কৌতূহল জানি fn [x]যে ওপি কোডটির পুনরায় লেখার পরিবর্তিত ক্লোজার সংস্করণে অভিন্ন কার্যকারিতা থাকবে। তদ্ব্যতীত, ক্লোজার কোডটির বহনযোগ্যতা নিয়ে কোনও সমস্যা হবে?

3

আপনি (এফএন [প্যারাম] (বডি)) সাজানোর অজানা ফাংশন থাকতে পারেন। কেবল # সিনট্যাক্স বাসা বাঁধতে সমর্থন করে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.