एकल तर्क और अल्पविराम के साथ उद्धरण का क्या मतलब है? (बोली, arg)


15

(quote x)बनाता है का मूल्यांकन x नहीं किया है, लेकिन एक जोड़ने ,के सामने xभीतर quoteबनाता है यह मूल्यांकन किया। फिर इसके सामने अल्पविराम के साथ एकल तर्क के साथ उद्धरण का उपयोग करने की बात क्या है, जैसे (quote ,x):?

कष्टप्रद तीरों से रेखा 59 से प्रेरित :

(put (quote ,cmd) 'aa--alts ,alternatives)

क्यों (put cmd 'aa-alts ,alternatives)समान रूप से अच्छा नहीं है?

जवाबों:


20

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

सरल उदाहरणों की एक जोड़ी:

(setq a "a's value" b "b's value" c "c's value")
'(a  b  c)                              ; => (a b c)
`(,a b ,c)                              ; => ("a's value" b "c's value")

जिन कॉमाओं का आप जिक्र कर रहे हैं, वे एक स्थूल परिभाषा में हैं, जो बदले में, एक backquoted का उपयोग करता है progn:

(defmacro add-annoying-arrows-advice (cmd alternatives)
  `(progn
     (add-to-list 'annoying-commands (quote ,cmd))
     (put (quote ,cmd) 'aa--alts ,alternatives)
     (defadvice ,cmd (before annoying-arrows activate)
       (when annoying-arrows-mode
         (aa--maybe-complain (quote ,cmd))))))

,cmdbackquote के भीतर आप cmdप्रतीक के बजाय जगह के मूल्य को रखने की अनुमति देता है cmd


1
अक्की, इसलिए सामने बोली का prognमतलब है कि आपको उस सामान के सामने अल्पविराम लगाना होगा जिसका आप मूल्यांकन करना चाहते हैं, चाहे वह कितना भी नेस्टेड क्यों न हो? ( ,cmdएक और सूची के भीतर है, सीधे भीतर नहीं (progn)।)
अनफुन कैट

यह इसे बाहर का परीक्षण करने के लिए एक अच्छा अवसर की तरह लगता है! मूल्यांकन करने (setq a "a's value" b "b's value" c "c's value")और फिर मूल्यांकन करने का प्रयास करें `(a '(,b c))
दान

अन्य न्यूब्स: टेक्स्ट को अपने स्क्रैच बफर में जोड़ने के लिए मूल्यांकन करें, फिर अपने कर्सर को लाइन के अंत में रखें, फिर Cxe दबाएं।
अनफिन कैट

11

ऐसा इसलिए है क्योंकि यह एक मैक्रो के अंदर है। एक मैक्रो को लिस्प फॉर्म वापस करने की आवश्यकता होती है, जो तब बदले में मूल्यांकन किया जाता है।

उदाहरण के लिए, इस मैक्रो के पहले आह्वान को देखते हुए:

(add-annoying-arrows-advice previous-line '(ace-jump-mode backward-paragraph isearch-backward ido-imenu smart-up))

हमें समाहित करने के लिए विस्तार की आवश्यकता है:

(put 'previous-line 'aa-alts '(ace-jump-mode backward-paragraph isearch-backward ido-imenu smart-up))

जो (quote ,cmd)प्राप्त होता है। यदि मैक्रो cmdइसके बजाय सादे का उपयोग करेगा , तो इसे शाब्दिक रूप से रखा जाएगा और विस्तार होगा:

(put cmd 'aa-alts '(ace-jump-mode backward-paragraph isearch-backward ido-imenu smart-up))

जो एक त्रुटि है, क्योंकि cmdउस वातावरण में परिभाषित नहीं किया गया है जहां मैक्रो का उपयोग किया जाता है।


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