क्या `# '(लैम्ब्डा ...` और `(लैम्ब्डा ...)? [डुप्लिकेट] में कोई अंतर है?

Dec 14 2020

में प्रैक्टिकल कॉमन लिस्प का एक उदाहरण है REMOVE-IF-NOTएक लैम्ब्डा के साथ:

CL-USER> (remove-if-not #'(lambda (x) (evenp x)) '(1 2 3 4 5))
(2 4)

क्या यह इससे अलग है:

CL-USER> (remove-if-not (lambda (x) (evenp x)) '(1 2 3 4 5))
(2 4)

क्या एक (lambda..)मूल्य संयोग-समारोह रूप है #'(..)? REPL पर ऐसा लगता है, लेकिन जैसा कि मैं नया हूँ लिस्प में मैं कुछ अनदेखी कर सकता हूं (और मुझे निश्चित रूप से गलत मिला है, इसलिए कृपया मुझे भी उस पर सही करें)।

जवाब

4 tfb Dec 14 2020 at 19:03

ये दो चीजें हैं, जैसा कि आपको संदेह है, वही:

  • #'एक पढ़ा स्थूल है, और के #'xरूप में पढ़ा जाता है (function x)। तो #'(lambda (...) ...)इस रूप में पढ़ा जाता है (function (lambda (...) ...)), functionसीएल में विशेष ऑपरेटर कहां है जो कहता है कि इसका तर्क एक फ़ंक्शन को दर्शाता है;
  • lambdaको मैक्रो के रूप में परिभाषित किया गया है: का विस्तार (lambda (...) ...)है (function (lambda (...) ...): पिछले एक के समान रूप।

इसका मतलब यह है कि #'(lambda (...) ...), (lambda (...) ...)और (function (lambda (...) ...))सभी सीएल में समान हैं: वे सभी (lambda (...) ...)वर्तमान शाब्दिक वातावरण में निर्दिष्ट फ़ंक्शन को दर्शाते हैं।

दो कारणों से लोग अभी भी #'(lambda (...) ...)संस्करण का उपयोग कर सकते हैं :

  • स्थिरता - आपको ज़रूरत है, उदाहरण के लिए #'fooयदि fooएक फ़ंक्शन है, तो इसे lambdaमामले के लिए भी उपयोग करने के लिए अधिक सुसंगत के रूप में देखा जा सकता है;
  • यह हमेशा सीएल में ऐसा मामला नहीं lambdaथा, जिसमें अब वृहद परिभाषा थी, इसलिए कोड जो मूल सीएल विनिर्देश और एएनएसआई मानक के बीच लिखा गया था, या जिसे उन लोगों द्वारा लिखा गया था, जो उस समय को याद करते हैं, #'प्रपत्र का उपयोग कर सकते हैं ।