क्या `# '(लैम्ब्डा ...` और `(लैम्ब्डा ...)? [डुप्लिकेट] में कोई अंतर है?
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
था, जिसमें अब वृहद परिभाषा थी, इसलिए कोड जो मूल सीएल विनिर्देश और एएनएसआई मानक के बीच लिखा गया था, या जिसे उन लोगों द्वारा लिखा गया था, जो उस समय को याद करते हैं,#'
प्रपत्र का उपयोग कर सकते हैं ।