लिस्प में '(या उद्धरण) का उपयोग कब करें?


114

एक परिचयात्मक लिस्प पुस्तक के प्रमुख भागों के माध्यम से बनाने के बाद, मैं अभी भी नहीं समझ सका कि विशेष ऑपरेटर (quote)(या समतुल्य ') फ़ंक्शन क्या करता है, फिर भी यह सभी लिस्प कोड पर है जो मैंने देखा है।

यह क्या करता है?

जवाबों:


178

संक्षिप्त उत्तर डिफ़ॉल्ट मूल्यांकन नियमों को बायपास करें और अभिव्यक्ति (प्रतीक या s-exp) का मूल्यांकन न करें , इसे टाइप किए गए फ़ंक्शन के साथ पास करें।

दीर्घ उत्तर: डिफ़ॉल्ट मूल्यांकन नियम

जब एक नियमित (मैं उस बाद में आऊंगा) फ़ंक्शन को आमंत्रित किया जाता है, तो इसके लिए पारित सभी तर्कों का मूल्यांकन किया जाता है। इसका मतलब है आप इसे लिख सकते हैं:

(* (+ a 2)
   3)

जो बदले में (+ a 2), मूल्यांकन करके aऔर 2. aवर्तमान चर बंधन सेट में प्रतीक के मूल्य को देखा जाता है, और फिर प्रतिस्थापित किया जाता है। कहते हैं aवर्तमान में मान 3 के लिए बाध्य है:

(let ((a 3))
  (* (+ a 2)
     3))

हमें मिलेगा (+ 3 2), + फिर 3 और 2 की पैदावार पर लगाया गया है। हमारा मूल रूप अब (* 5 3)15 उपज है।

quoteपहले से ही समझाओ !

ठीक है। जैसा कि ऊपर देखा गया है, किसी फ़ंक्शन के सभी तर्कों का मूल्यांकन किया जाता है, इसलिए यदि आप प्रतीक को पास करना चाहते हैं aऔर इसके मूल्य को नहीं, तो आप इसका मूल्यांकन नहीं करना चाहते हैं। लिस्प प्रतीक उनके मूल्यों के रूप में दोनों को दोगुना कर सकते हैं, और मार्कर जहां आप अन्य भाषाओं में स्ट्रिंग्स का उपयोग करेंगे, जैसे कि हैश टेबल की कुंजी।

यह वह जगह है जहाँ quoteआप कहते हैं कि आप पायथन एप्लिकेशन से संसाधन आवंटन करना चाहते हैं, लेकिन लिस्प में प्लॉटिंग करें। क्या आपका पायथन ऐप कुछ इस तरह है:

print("'(")
while allocating:
    if random.random() > 0.5:
        print(f"(allocate {random.randint(0, 20)})")
    else:
        print(f"(free {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

काफी बेहतर! संयोग से, यह पैटर्न (ज्यादातर) मैक्रोज़ में इतना सामान्य है, कि बस ऐसा करने के लिए विशेष वाक्यविन्यास है। चौकी:

(defun mess-with (number string)
  `(value-of-number ,(1+ number) something-with-string ,(length string)))

यह उपयोग करने जैसा है quote, लेकिन अल्पविरामों के साथ उपसर्ग करके कुछ तर्कों का स्पष्ट रूप से मूल्यांकन करने के विकल्प के साथ। परिणाम का उपयोग करने के बराबर है list, लेकिन यदि आप एक मैक्रो से कोड उत्पन्न कर रहे हैं, तो आप अक्सर केवल दिए गए कोड के छोटे हिस्सों का मूल्यांकन करना चाहते हैं, इसलिए बैकवॉट अधिक अनुकूल है। छोटी सूचियों के लिए, listअधिक पठनीय हो सकता है।

अरे, आप के बारे में भूल गए quote!

तो यह हमें कहां छोड़ता है? ओह ठीक है, quoteवास्तव में क्या करता है? यह केवल अपने तर्क (रिटर्न) को बिना शर्त लौटाता है! याद रखें कि मैंने नियमित कार्यों के बारे में शुरुआत में क्या कहा था? यह बताता है कि कुछ ऑपरेटरों / कार्यों को अपने तर्कों का मूल्यांकन करने की आवश्यकता नहीं है। IF के रूप में - आप नहीं चाहेंगे कि दूसरी शाखा का मूल्यांकन किया जाए, यदि वह सही नहीं ली गई है? तथाकथित विशेष ऑपरेटर , मैक्रोज़ के साथ मिलकर, जैसे काम करते हैं। विशेष ऑपरेटर भी भाषा के "स्वयंसिद्ध" हैं - नियमों का न्यूनतम सेट - जिस पर आप शेष लिस्प को अलग-अलग तरीकों से एक साथ जोड़कर लागू कर सकते हैं।

पर वापस 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डेटा संरचनाओं को हल्के (कोई परिभाषित करने की आवश्यकता नहीं ) के रूप में उपयोग किया जा सकता है !

यदि आप और अधिक सीखना चाहते हैं, तो मैं पीटर सिबेल की पुस्तक प्रैक्टिकल कॉमन लिस्प को व्यावहारिक रूप से सीखने के लिए लिस्प की सलाह देता हूं , यदि आप पहले से ही प्रोग्रामिंग में हैं। आखिरकार आपकी लिस्प यात्रा पर, आप पैकेजों का भी उपयोग करना शुरू कर देंगे। रॉन गैरेट का द इडियट गाइड टू कॉमन लिस्प पैकेज आपको उन लोगों का अच्छा विवरण देगा।

हैप्पी हैकिंग!


मेरे एमएसीएस में एसबीसीएल सेटअप है और जब मैं टाइप करता हूं तो यह 'सही' होता है, यह आउटपुट में केवल अंतिम यानी ट्रू रिटर्न होता है। यहां तक कि portacle में मैं एक ही उत्पादन हो रही है
Totoro

@ टॉटरो किसी फ़ंक्शन का रिटर्न मान या लिस्प में केवल कई कथन अंतिम अभिव्यक्ति है, इसलिए यह वास्तव में this, फिर is, फिर से लौटता है true, लेकिन आप केवल अंतिम रिटर्न को देखते हैं। (यह सच है और अलग-अलग कथन हैं)
वीज़ल

52

यह कहता है "मेरा मूल्यांकन मत करो"। उदाहरण के लिए, यदि आप किसी सूची को डेटा के रूप में उपयोग करना चाहते हैं, और कोड के रूप में नहीं, तो आप इसके सामने एक उद्धरण डालेंगे। उदाहरण के लिए,

(print '(+ 3 4))प्रिंट "(+ 3 4)", जबकि (print (+ 3 4))प्रिंट "7"


इसका मूल्यांकन कैसे किया जा सकता है, उदाहरण के लिए एक unquoteकमांड है?
चूना

3
@William Lisps नामक एक सुविधाजनक समारोह है eval: (print (eval '(+ 3 4)))। यह वही है जो लिस्प्स को इतना महान बनाता है: सूचियां कोड हैं, और कोड सूचियां हैं, इसलिए एक लिस्प कार्यक्रम खुद को हेरफेर कर सकता है।
डार्कफलाइन

18

अन्य लोगों ने इस सवाल का जवाब दिया है और माथियास बेनकार्ड ने एक उत्कृष्ट चेतावनी दी है।

आप उन तरीकों का उपयोग करने के लिए बहुत से उपयोग न करें, जो कि बहुत कम हैं। यह संकलक उद्धृत सूचियों को स्थिरांक के रूप में संकलित करने की अनुमति देता है। अक्सर, एक कंपाइलर मेमोरी में उनके लिए एक एकल मान बनाकर स्थिरांक का अनुकूलन करेगा और फिर सभी स्थानों से उस एकल मान को संदर्भित करेगा जहां निरंतर दिखाई देता है। दूसरे शब्दों में, यह एक गुमनाम वैश्विक चर की तरह निरंतर व्यवहार कर सकता है।

इससे स्पष्ट समस्याएं हो सकती हैं। यदि आप एक स्थिरांक को संशोधित करते हैं, तो यह पूरी तरह से असंबंधित कोड में उसी स्थिरांक के अन्य उपयोगों को बहुत अच्छी तरह से संशोधित कर सकता है। उदाहरण के लिए, आप किसी फ़ंक्शन में कुछ चर की तुलना '(1 1) से कर सकते हैं, और एक पूरी तरह से अलग फ़ंक्शन में,' (1 1) के साथ एक सूची शुरू कर सकते हैं और फिर उसमें अधिक सामान जोड़ सकते हैं। इन फ़ंक्शन को चलाने पर, आप पा सकते हैं कि पहला फ़ंक्शन अब चीजों को ठीक से मेल नहीं खाता है, क्योंकि यह अब चर की तुलना करने की कोशिश कर रहा है '(1 1 2 3 5 8 13), जो कि दूसरा फ़ंक्शन वापस आ गया है। ये दोनों कार्य पूरी तरह से असंबंधित हैं, लेकिन स्थिरांक के उपयोग के कारण एक दूसरे पर इनका प्रभाव पड़ता है। यहां तक ​​कि क्रैजियर के बुरे प्रभाव भी हो सकते हैं, जैसे पूरी तरह से सामान्य सूची पुनरावृत्ति अचानक अनंत लूपिंग।

जब आपको तुलना के लिए एक स्थिर सूची की आवश्यकता हो, तो उद्धरण का उपयोग करें। सूची का उपयोग करें जब आप परिणाम को संशोधित करेंगे।


तो ऐसा लगता है कि आपको (list (+ 1 2)) ज्यादातर समय का उपयोग करना चाहिए । यदि हां, तो आप (+ 1 2)इस तरह के उदाहरण के अंदर के मूल्यांकन को कैसे रोकते हैं ? क्या कोई unquoteआज्ञा है?
लाइम

1
क्या आप के बराबर '((3))या के बराबर '((+ 1 2))चाहते हैं? यदि बाद, आप और अधिक उपयोग करने के लिए list: (list (list '+ 1 2))। या अगर आप के बराबर चाहता था '(+ 1 2), बस (list '+ 1 2)। और याद रखें, यदि आप सूची को संशोधित नहीं कर रहे हैं, तो बेझिझक उद्धरण का उपयोग करें: कुछ भी गलत नहीं है '(+ 1 2)अगर आप केवल इसके या कुछ के खिलाफ तुलना कर रहे हैं।
Xanthir

1
क्या आपको लगता है कि जहाँ उद्धृत सूचियाँ स्थिरांक के रूप में मानी जानी चाहिए?
लाइम

हाइपरस्पीक clhs.lisp.se/Body/s_quote.htm का कहना है कि यदि उद्धृत वस्तु को विनाशकारी रूप से संशोधित किया गया है तो व्यवहार अपरिभाषित है। यह निहित है कि यह आकृतियों को परमाणु मूल्यों के रूप में व्यवहार करने की अनुमति देता है।
ज़ांथिर

14

इस प्रश्न का एक उत्तर कहता है कि QUOTE "सूची डेटा संरचना बनाता है"। यह काफी सही नहीं है। QUOTE इससे ज्यादा मौलिक है। वास्तव में, QUOTE एक तुच्छ ऑपरेटर है: इसका उद्देश्य कुछ भी होने से रोकना है। विशेष रूप से, यह कुछ भी नहीं बनाता है।

क्या (QUOTE X) कहता है कि मूल रूप से "कुछ मत करो, बस मुझे एक्स दे दो" X को (QUOTE (ABC)) या प्रतीक (QUOTE FOO) के रूप में एक सूची की आवश्यकता नहीं है। यह कोई भी वस्तु हो सकती है। वास्तव में, (LIST 'QUOTE SOME-OBJECT) द्वारा निर्मित सूची का मूल्यांकन करने का परिणाम हमेशा कुछ-कुछ, जो भी हो, कुछ-कुछ ही लौटाएगा।

अब, कारण (QUOTE (ABC)) ऐसा लगता है मानो इसने एक सूची बनाई है जिसके तत्व A, B, और C हैं, ऐसी सूची वास्तव में वही है जो यह लौटाता है; लेकिन जिस समय QUOTE फॉर्म का मूल्यांकन किया जाता है, उस समय कोड के निष्पादन से पहले लोडर या रीडर द्वारा बनाई गई सूची आम तौर पर थोड़ी देर के लिए पहले से ही अस्तित्व में होती है (QUOTE फॉर्म के एक घटक के रूप में!)।

इसका एक निहितार्थ यह है कि न्यूबॉइज़ को अक्सर यात्रा करने की आदत होती है, यह कि किसी QUOTE फॉर्म द्वारा लौटी सूची को संशोधित करना बहुत नासमझी है। QUOTE द्वारा लौटाया गया डेटा, सभी इरादों और उद्देश्यों के लिए, के भाग के रूप में माना जाता है कोड को निष्पादित किए जाने वाले जाना चाहिए और इसलिए इसे केवल-पढ़ने के लिए माना जाना चाहिए!


11

उद्धरण किसी प्रपत्र के निष्पादन या मूल्यांकन को रोकता है, इसे डेटा में बदल देता है। सामान्य तौर पर आप डेटा को तब तक निष्कासित कर सकते हैं।

उद्धरण सूची डेटा संरचना बनाता है, उदाहरण के लिए, निम्नलिखित समतुल्य हैं:

(quote a)
'a

इसका उपयोग सूचियाँ (या पेड़) बनाने के लिए भी किया जा सकता है:

(quote (1 2 3))
'(1 2 3)

आप शायद लिस्प पर एक परिचयात्मक पुस्तक प्राप्त कर रहे हैं, जैसे कि प्रैक्टिकल कॉमन लिस्प (जो ऑन-लाइन पढ़ने के लिए उपलब्ध है)।


3

Emacs लिस्प में:

क्या उद्धृत किया जा सकता है?

सूचियाँ और प्रतीक।

एक संख्या का उद्धरण स्वयं संख्या का मूल्यांकन करता है: '5जैसा है वैसा ही है5

जब आप सूचियाँ उद्धृत करते हैं तो क्या होता है?

उदाहरण के लिए:

'(one two) का मूल्यांकन करता है

(list 'one 'two) जो मूल्यांकन करता है

(list (intern "one") (intern ("two")))

(intern "one")"एक" नाम का एक प्रतीक बनाता है और इसे "केंद्रीय" हैश-मैप में संग्रहीत करता है, इसलिए कभी भी आप कहते हैं कि 'oneप्रतीक नाम दिया गया है"one" उस केंद्रीय हैश-मैप में दिखाई देगा।

लेकिन एक प्रतीक क्या है?

उदाहरण के लिए, OO- भाषाओं (जावा / जावास्क्रिप्ट / पायथन) में एक प्रतीक को एक ऑब्जेक्ट के रूप में दर्शाया जा सकता है जिसमें एक nameफ़ील्ड होता है, जो प्रतीक का नाम है"one" ऊपर है, और डेटा और / या कोड इस ऑब्जेक्ट के साथ जुड़ा हो सकता है।

तो पायथन में एक प्रतीक के रूप में लागू किया जा सकता है:

class Symbol:
   def __init__(self,name,code,value):
       self.name=name
       self.code=code
       self.value=value

उदाहरण के लिए Emacs Lisp में एक प्रतीक में 1) डेटा जुड़ा हो सकता है (और एक ही समय में - एक ही प्रतीक के लिए) 2 इसके साथ जुड़ा कोड - संदर्भ के आधार पर, या तो डेटा या कोड कहा जाता है।

उदाहरण के लिए, एलिस्प में:

(progn
  (fset 'add '+ )
  (set 'add 2)
  (add add add)
)

का मूल्यांकन करता है 4

क्योंकि (add add add)मूल्यांकन करता है:

(add add add)
(+ add add)
(+ 2 add)
(+ 2 2)
4

इसलिए, उदाहरण के लिए, Symbolऊपर दिए गए पायथन में हमने जिस कक्षा को परिभाषित किया है , उसका उपयोग करके इस addELisp-Symbol को पायथन में लिखा जा सकता है।Symbol("add",(lambda x,y: x+y),2)

आईआरसी पर लोगों के लिए बहुत धन्यवाद # प्रतीकों और उद्धरण मुझे समझाने के लिए।


2

जब हम तर्क के मूल्य को पारित करने के बजाय स्वयं एक तर्क पारित करना चाहते हैं तो हम उद्धरण का उपयोग करते हैं। यह ज्यादातर सूची, जोड़े और परमाणुओं के उपयोग से गुजरने वाली प्रक्रिया से संबंधित है जो सी प्रोग्रामिंग भाषा में उपलब्ध नहीं हैं (ज्यादातर लोग सी प्रोग्रामिंग का उपयोग करके प्रोग्रामिंग शुरू करते हैं, इसलिए हम भ्रमित हो जाते हैं) यह योजना प्रोग्रामिंग भाषा में कोड है जो लिस्प की एक बोली है और मुझे लगता है कि आप इस कोड को समझ सकते हैं।

(define atom?              ; defining a procedure atom?
  (lambda (x)              ; which as one argument x
(and (not (null? x)) (not(pair? x) )))) ; checks if the argument is atom or not
(atom? '(a b c)) ; since it is a list it is false #f

अंतिम पंक्ति (परमाणु? 'Abc) abc पास कर रही है क्योंकि यह जाँचने की प्रक्रिया है कि abc एक परमाणु है या नहीं, लेकिन जब आप (atom? Abc) पास करते हैं तो यह abc के मान की जाँच करता है और मान को पार करता है? यह। चूंकि, हमने इसका कोई मूल्य नहीं दिया है


1

उद्धरण अपने तर्कों का आंतरिक प्रतिनिधित्व लौटाता है। रास्ते के माध्यम से जुताई के बाद क्या बोली क्या नहीं की कई स्पष्टीकरण , कि जब प्रकाश बल्ब चला गया है। यदि REPL ने फ़ंक्शन नामों को UPPER-CASE में परिवर्तित नहीं किया, जब मैंने उन्हें उद्धृत किया, तो हो सकता है कि यह मेरे ऊपर न हो।

इसलिए। साधारण लिस्प फ़ंक्शन अपने तर्कों को एक आंतरिक प्रतिनिधित्व में परिवर्तित करते हैं, तर्कों का मूल्यांकन करते हैं, और फ़ंक्शन को लागू करते हैं। उद्धरण अपने तर्कों को एक आंतरिक प्रतिनिधित्व में परिवर्तित करता है, और बस वही लौटाता है। तकनीकी रूप से यह कहना सही है कि बोली "मूल्यांकन नहीं करती है", लेकिन जब मैं यह समझने की कोशिश कर रहा था कि उसने क्या किया है, तो वह बताती है कि जो वह नहीं करता है वह निराशाजनक था। मेरा टोस्टर लिस्प कार्यों का मूल्यांकन नहीं करता है; लेकिन यह नहीं है कि आप कैसे समझाते हैं कि एक टोस्टर क्या करता है।


1

संक्षिप्त उत्तर:

quoteइसका मूल्यांकन किए बिना इसका मतलब है, और backquote उद्धरण है लेकिन पीछे के दरवाजे छोड़ दें

एक अच्छा संदर्भ:

Emacs लिस्प संदर्भ मैनुअल यह बहुत स्पष्ट है

9.3 उद्धरण

विशेष रूप से उद्धृत उद्धरण, इसके मूल्यांकन के बिना, अपने एकल तर्क को लौटाता है। यह निरंतर प्रतीकों और सूचियों को शामिल करने का एक तरीका प्रदान करता है, जो किसी कार्यक्रम में स्व-मूल्यांकन करने वाली वस्तुएं नहीं हैं। (स्व-मूल्यांकन करने वाली वस्तुओं जैसे संख्याओं, तारों और वैक्टरों को उद्धृत करना आवश्यक नहीं है।)

विशेष रूप: भाव वस्तु

This special form returns object, without evaluating it. 

क्योंकि उद्धरण का उपयोग कार्यक्रमों में इतनी बार किया जाता है, लिस्प इसके लिए एक सुविधाजनक रीड सिंटैक्स प्रदान करता है। एक एपोस्ट्रोफ वर्ण ('' ') के बाद एक लिस्प ऑब्जेक्ट (सिंटैक्स में पढ़ा जाता है) एक सूची में फैलता है जिसका पहला तत्व उद्धरण है, और जिसका दूसरा तत्व ऑब्जेक्ट है। इस प्रकार, रीड सिंटैक्स 'x' (उद्धरण x) के लिए एक संक्षिप्त नाम है।

यहां कुछ उदाहरण दिए गए हैं जो उद्धरण का उपयोग करते हैं:

(quote (+ 1 2))
      (+ 1 2)

(quote foo)
      foo

'foo
      foo

''foo
      (quote foo)

'(quote foo)
      (quote foo)

9.4 बैककोट

Backquote निर्माण आपको एक सूची उद्धृत करने की अनुमति देते हैं, लेकिन उस सूची के तत्वों का चयन करें। सरलतम मामले में, यह विशेष प्रपत्र उद्धरण (पिछले अनुभाग में वर्णित है; उद्धरण देखें) के समान है। उदाहरण के लिए, ये दोनों रूप समान परिणाम देते हैं:

`(a list of (+ 2 3) elements)
      (a list of (+ 2 3) elements)

'(a list of (+ 2 3) elements)
      (a list of (+ 2 3) elements)

विशेष मार्कर ',' बैक टू बैक के तर्क के अंदर एक मूल्य है जो स्थिर नहीं है। Emacs लिस्प मूल्यांकनकर्ता ',' के तर्क का मूल्यांकन करता है, और सूची संरचना में मूल्य डालता है:

`(a list of ,(+ 2 3) elements)
      (a list of 5 elements)

सूची संरचना के गहरे स्तर पर ',' के साथ प्रतिस्थापन की अनुमति है। उदाहरण के लिए:

`(1 2 (3 ,(+ 4 5)))
      (1 2 (3 9))

आप विशेष मार्कर ', @' का उपयोग करके परिणामी सूची में एक मूल्यांकित मान को विभाजित कर सकते हैं। मसालेदार सूची के तत्व परिणामी सूची के अन्य तत्वों के समान स्तर पर तत्व बन जाते हैं। '`' का उपयोग किए बिना समतुल्य कोड अक्सर अपठनीय है। यहाँ कुछ उदाहरण हैं:

(setq some-list '(2 3))
      (2 3)

(cons 1 (append some-list '(4) some-list))
      (1 2 3 4 2 3)

`(1 ,@some-list 4 ,@some-list)
      (1 2 3 4 2 3)

1
Code is data and data is code.  There is no clear distinction between them.

यह एक शास्त्रीय कथन है जिसे कोई भी लिस्प प्रोग्रामर जानता है।

जब आप किसी कोड को उद्धृत करते हैं, तो वह कोड डेटा होगा।

1 ]=> '(+ 2 3 4)
;Value: (+ 2 3 4)

1 ]=> (+ 2 3 4)
;Value: 9

जब आप किसी कोड को उद्धृत करते हैं, तो परिणाम डेटा होगा जो उस कोड का प्रतिनिधित्व करता है। इसलिए, जब आप डेटा के साथ काम करना चाहते हैं जो उस प्रोग्राम का प्रतिनिधित्व करता है जो आप उस प्रोग्राम को उद्धृत करते हैं। यह परमाणु सूचियों के लिए भी मान्य है, न केवल सूचियों के लिए:

1 ]=> 'code
;Value: code

1 ]=> '10
;Value: 10

1 ]=> '"ok"
;Value: "ok"

1 ]=> code
;Unbound variable: code

यह मानते हुए कि आप लिस्प में एम्बेडेड प्रोग्रामिंग भाषा बनाना चाहते हैं - आप उन कार्यक्रमों के साथ काम करेंगे, जिन्हें योजना में उद्धृत किया गया है (जैसे '(+ 2 3)) और उन्हें आपके द्वारा बनाई गई भाषा में कोड के रूप में व्याख्या किया जाता है, कार्यक्रमों को एक अर्थपूर्ण व्याख्या देकर। इस मामले में आपको डेटा रखने के लिए उद्धरण का उपयोग करने की आवश्यकता है, अन्यथा इसका मूल्यांकन बाहरी भाषा में किया जाएगा।

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