लांग उत्तर: डिफ़ॉल्ट मूल्यांकन नियम
एक नियमित रूप से समारोह (मुझे लगता है कि बाद में करने के लिए आया हूँ) है, शुरू हो जाती है इसे करने के लिए पारित कर दिया सभी तर्कों मूल्यांकन किया जाता है।इसका मतलब है आप यह लिख सकते हैं:
(* (+ a 2)
3)
बदले में कौन सा (+ a 2)
मूल्यांकन करता है, a
और 2. प्रतीक a
का मूल्य मूल्यांकन द्वारा वर्तमान चर बाध्यकारी सेट में देखा है, और फिर बदल दिया। कहो a
वर्तमान में मान 3 के लिए बाध्य है:
(let ((a 3))
(* (+ a 2)
3))
हम (+ 3 2)
प्राप्त करना चाहते हैं, तो + 3 और 2 उपज 5. हमारा मूल रूप पर शुरू हो जाती है अब (* 5 3)
उपज 15.
के बारे में बताएं quote
है पहले से!
ठीक है। जैसा कि ऊपर देखा गया है, किसी फ़ंक्शन के सभी तर्कों का मूल्यांकन किया जाता है, इसलिए यदि आप प्रतीकa
पास करना चाहते हैं और इसका मूल्य नहीं है, तो आप इसका मूल्यांकन नहीं करना चाहते हैं। लिस्प प्रतीक दोनों उनके मूल्यों के रूप में दोगुना हो सकते हैं, और मार्कर जहां आप अन्य भाषाओं में स्ट्रिंग्स का इस्तेमाल करते हैं, जैसे हैंश टेबल के लिए चाबियाँ।
यह वह जगह है जहां quote
आता है। कहें कि आप पाइथन एप्लिकेशन से संसाधन आवंटन प्लॉट करना चाहते हैं, बल्कि लिस्प में साजिश करना चाहते हैं। आप देते उत्पादन इस (थोड़ा prettyfied) की तरह लग रही
print "'("
while allocating:
if random.random() > 0.5:
print "(allocate %d)" random.randint(0, 20)
else:
print "(free %d)" % random.randint(0, 20)
...
print ")"
:
'((allocate 3)
(allocate 7)
(free 14)
(allocate 19)
...)
याद रखें कि मैं क्या कहा quote
के बारे में ("टिक") डिफ़ॉल्ट नियम के कारण नहीं अपने अजगर एप्लिकेशन है कुछ इस तरह करते हैं लागू करने के लिए? अच्छा। अन्यथा क्या होगा कि allocate
और free
के मान देखे गए हैं, और हम इसे नहीं चाहते हैं। हमारे लिस्प में, हम करना चाहते हैं:
(dolist (entry allocation-log)
(case (first entry)
(allocate (plot-allocation (second entry)))
(free (plot-free (second entry)))))
ऊपर दिए गए डेटा के लिए, फ़ंक्शन कॉल की निम्न क्रम होगा किए गए हैं:
(plot-allocation 3)
(plot-allocation 7)
(plot-free 14)
(plot-allocation 19)
लेकिन क्या list
के बारे में?
अच्छा, कभी-कभी आप तर्कों का मूल्यांकन करना चाहते हैं। मान लें कि आपके पास एक निफ्टी फ़ंक्शन है जो एक संख्या और स्ट्रिंग में हेरफेर कर रहा है और परिणामस्वरूप ... चीजों की एक सूची लौटा रहा है। आइए एक झूठी शुरुआत करें:
(defun mess-with (number string)
'(value-of-number (1+ number) something-with-string (length string)))
Lisp> (mess-with 20 "foo")
(VALUE-OF-NUMBER (1+ NUMBER) SOMETHING-WITH-STRING (LENGTH STRING))
हे! यही वह नहीं है जिसे हम चाहते थे। हम चुनिंदा कुछ तर्कों का मूल्यांकन करना चाहते हैं, और दूसरों को प्रतीकों के रूप में छोड़ना चाहते हैं। # 2 आज़माएं!
(defun mess-with (number string)
(list 'value-of-number (1+ number) 'something-with-string (length string)))
Lisp> (mess-with 20 "foo")
(VALUE-OF-NUMBER 21 SOMETHING-WITH-STRING 3)
नॉट जस्ट quote
, लेकिन backquote
बहुत बेहतर! संयोग से, यह पैटर्न (ज्यादातर) मैक्रोज़ में इतना आम है, कि ऐसा करने के लिए विशेष वाक्यविन्यास है।backquote:
(defun mess-with (number string)
`(value-of-number ,(1+ number) something-with-string ,(length string)))
यह quote
का उपयोग कर की तरह है, लेकिन विकल्प के साथ स्पष्ट रूप से उन्हें अल्पविराम के साथ लगाकर द्वारा कुछ तर्कों का मूल्यांकन करने के। नतीजा list
का उपयोग करने के बराबर है, लेकिन यदि आप मैक्रो से कोड उत्पन्न कर रहे हैं तो आप अक्सर कोड के छोटे हिस्सों का मूल्यांकन करना चाहते हैं, इसलिए बैकक्वॉट अधिक उपयुक्त है। छोटी सूचियों के लिए, list
अधिक पठनीय हो सकता है।
अरे, आप quote
भूल गए हैं!
तो, यह हमें कहां छोड़ देता है? ओह ठीक है, quote
वास्तव में क्या करता है? यह बस अपने तर्क (ओं) unevaluated देता है! याद रखें कि मैंने नियमित कार्यों के बारे में शुरुआत में क्या कहा था? यह पता चला है कि कुछ ऑपरेटरों/कार्यों को उनके तर्कों का मूल्यांकन करने की आवश्यकता नहीं है। जैसे कि अगर - यदि आप नहीं लिया गया था, तो आप नहीं चाहते कि अन्य शाखा का मूल्यांकन किया जाए, है ना? तथाकथित विशेष ऑपरेटरों, मैक्रोज़ के साथ, इस तरह काम करते हैं। विशेष ऑपरेटर भी भाषा का "सिद्धांत" हैं - नियमों का न्यूनतम सेट - जिस पर आप अलग-अलग तरीकों से एक साथ संयोजन करके बाकी लिस्प को कार्यान्वित कर सकते हैं।
वापस quote
है, हालांकि:
Lisp> (quote spiffy-symbol)
SPIFFY-SYMBOL
Lisp> 'spiffy-symbol ; ' is just a shorthand ("reader macro"), as shown above
SPIFFY-SYMBOL
की तुलना करने के लिए (पर स्टील-बैंक कॉमन लिस्प):
Lisp> spiffy-symbol
debugger invoked on a UNBOUND-VARIABLE in thread #<THREAD "initial thread" RUNNING {A69F6A9}>:
The variable SPIFFY-SYMBOL is unbound.
Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.
(SB-INT:SIMPLE-EVAL-IN-LEXENV SPIFFY-SYMBOL #<NULL-LEXENV>)
0]
क्योंकि वहाँ है वर्तमान क्षेत्र में कोई spiffy-symbol
!
quote
, backquote
(अल्पविराम के साथ), और list
संक्षेप ऊपर उपकरण के कुछ आप सूचियों, कि मूल्यों का केवल सूचियों नहीं हैं बनाने के लिए उपयोग कर रहे हैं, लेकिन जैसा कि आप देखा हल्के के रूप में इस्तेमाल किया जा सकता (struct
परिभाषित करने की कोई आवश्यकता नहीं है) डेटा संरचनाएं!
यदि आप और जानना चाहते हैं, तो मैं लिस्प सीखने के व्यावहारिक दृष्टिकोण के लिए पीटर सेबेल की पुस्तक Practical Common Lisp की सलाह देता हूं, यदि आप पहले से ही प्रोग्रामिंग में हैं। आखिरकार आपकी लिस्प यात्रा पर, आप संकुल का उपयोग शुरू कर देंगे। रॉन गारेट का The Idiot's Guide to Common Lisp Packages आपको उन लोगों की अच्छी व्याख्या देगा।
हैप्पी हैकिंग!
इसका मूल्यांकन कैसे किया जा सकता है उदाहरण के लिए वहां 'unquote' कमांड है? – William
@ विलियम लिप्स के पास 'eval':' (प्रिंट (eval '(+ 3 4)) नामक एक सुविधाजनक कार्य है। लिस्प्स को इतना बढ़िया बनाता है: सूचियां कोड हैं, और कोड सूचियां हैं, इसलिए एक लिस्प प्रोग्राम स्वयं को कुशल बना सकता है। – darkfeline