हम क्लोजर में नेस्टेड शॉर्टहैंड फ़ंक्शन क्यों नहीं लिख सकते हैं?


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 तक पहुँच की आवश्यकता नहीं होती है , और जिस समय आपने किया था, उस समय आप वापस- (fn)सही जा सकते थे?
ज़ाज़

10

यह पूरी तरह से मनमाना है; पार्सर में कुछ पंक्तियाँ हैं जो इसे स्पष्ट रूप से अक्षम करती हैं। यदि आप उस पंक्ति को संपादित करते हैं, तो आपके पास अनाम कार्य हो सकते हैं, और वे ठीक उसी तरह कार्य करते हैं जैसे आप अपेक्षा करते हैं।

विशेष रूप से, लाइनों 634-635 में https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LispReader.java

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
ठीक है, पूरी तरह से मनमाना नहीं ; जब तक रिक हिकी सिर्फ एक मनमाना दिन नहीं था, तब तक एक कारण रहा होगा कि उसने इसे वहाँ रखा था, और आपको यह पता नहीं लगता कि वह कारण क्या है। ओह।
रॉबर्ट हार्वे

वाह, क्या पता! अच्छा - +1।

क्या यह परिवर्तन नेस्टेड विधियों के किसी भी अस्पष्ट पार्सिंग का कारण होगा? मैं fn [x]ओपी कोड के पुनर्लेखन के बारे में उत्सुक हूं कि संशोधित क्लोजर संस्करण में समान कार्यक्षमता होगी। इसके अलावा, क्या क्लोजर कोड की पोर्टेबिलिटी के साथ कोई समस्या होगी?

3

आपके पास (fn [params] (body)) तरह के अनाम कार्य हो सकते हैं। केवल # वाक्य रचना नेस्टिंग का समर्थन नहीं करती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.