2012-01-03 23 views
7

बहुत अस्पष्ट शीर्षक :)Clojure - भ्रम

मैं मैक्रो को नया हूँ के लिए खेद का हवाला देते हुए और मुसीबत इन दो बयानों के बीच अंतर को समझने हो रहा है: जब मैं उन्हें गंदें शब्द बोलना के बिना चलने

`(+ 1 2 ~(+ 2 3)) ; => (clojure.core/+ 1 2 5) 
'(+ 1 2 ~(+ 2 3)) ; => (+ 1 2 (clojure.core/unquote (+ 2 3))) 

, वे योग्यता के अलावा अन्य समान लगते हैं?

`(+ 1 2 (+ 2 3)) ; => (clojure.core/+ 1 2 (clojure.core/+ 2 3)) 
'(+ 1 2 (+ 2 3)) ; => (+ 1 2 (+ 2 3)) 

तो मूल रूप से मैं 'बनाम' द्वारा उलझन में हूं। मेरी समझ यह है कि वे दोनों सूची में सबकुछ उद्धृत करते हैं, यही कारण है कि मुझे यकीन नहीं है कि क्यों निर्विवाद अलग-अलग व्यवहार करता है। असल में 'वैसे ही व्यवहार करता है जिस तरह से मैं' और 'व्यवहार करने की अपेक्षा करता हूं।

धन्यवाद!

उत्तर

10

संक्षिप्त उत्तर यह है कि अनजान केवल बैकक्वॉट के अंदर काम करता है। एक सामान्य उद्धृत अभिव्यक्ति में, सबकुछ - ~ और अंदर/पीछे सबकुछ शामिल है - एक बैकक्वॉट अभिव्यक्ति के अंदर, ~ के अंदर/पीछे सब कुछ मूल्यांकन किया जाता है (लेकिन बाकी सब कुछ अनचाहे रहता है)। तो, नहीं, बैकक्वॉटेड अभिव्यक्ति के अंदर सब कुछ अनावश्यक नहीं है - आप ~ का उपयोग इसके अंदर टेम्पलेट के रूप में करने के लिए कर सकते हैं, जहां आप ~ के साथ "रिक्त स्थान भरें"।

संपादित करें: बोली के लिए (यमक इरादा) documentation अपने प्रश्न के लिए प्रासंगिक:

उद्धरण:

Quote (') 
'form => (quote form) 

और (special forms अनुभाग से):

(उद्धरण फार्म) अनियमित रूप पैदा करता है।

user=> '(a b c) 
(a b c) 

नोट समारोह एक कॉल करने के लिए किए गए कोई प्रयास नहीं है। वापसी मूल्य 3 प्रतीकों की एक सूची है।

सिंटेक्स-उद्धरण (भी quasiquote कहा जाता है, backquote):

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

+1

तुम भी एलन द्वारा लिस्प में महान कागज [अर्ध कोटेशन उल्लेख कर की अनुमति देता है Bawden] (http://www.scribd.com/doc/47702904/Bawden-Quasi-Quotation-in-Lisp)। – Daimrod

+0

डेमरोद, हाँ, लिंक के लिए धन्यवाद! (शुरुआती लोगों के लिए नोट: अन्य लिस्प बोलीभाषाओं और क्लोजर के बीच कुछ अंतर हैं। उदाहरण के लिए, सीएल और पेपर में, ',' (क्लोजर में व्हाइटस्पेस) का उपयोग बिना छेड़छाड़ के लिए किया जाता है। इसके अलावा, सीएल में, '' 'के बाहर बैकक्वॉटेड अभिव्यक्ति अमान्य है (आमतौर पर एक पाठक त्रुटि)।) – danlei

+0

धन्यवाद, मुझे एहसास नहीं हुआ कि वाक्यविन्यास-उद्धरण के लिए आरक्षित किया गया था। यह निश्चित रूप से परिणाम बताता है। मैं क्लोजर की जॉय के माध्यम से जा रहा हूं और मैंने प्रयोग करने के लिए मैक्रो अध्याय में रोका है और इस सामान को समझने की कोशिश की है, इसलिए संभव है कि मैंने अध्याय में स्पष्टीकरण को याद किया है :) – anonymous

4

अपने पहले दो अभिव्यक्तियों के परिणामों पर eval चलाने का प्रयास करें। पहला, ',' विस्तारित करता है '(+ 1 2 3) पर, जो अच्छी तरह से 6 का मूल्यांकन करता है। दूसरा,', "विस्तारित करता है" (+ 1 2 (unquote (+ 1 2))) पर, और उस संदर्भ में अनकोट मान्य नहीं है क्योंकि आप अब उद्धरण के अंदर नहीं हैं! तो यह पूरी तरह से मूल्यांकन करने में विफल रहता है।

असल में वहाँ के बीच 'और `दो अंतर हैं:

  • ` नाम स्थान-उत्तीर्ण सब कुछ
  • `unquoting