2012-12-07 10 views
7

मैं समस्या यह है कि मैं एक उदाहरण के समारोह के साथ उदाहरण देकर स्पष्ट करना होगा में चालू रखने के DATALOG प्रश्नों प्रोग्राम के रूप में निर्माण करने के लिए कोशिश कर रहा हूँ, लेकिन:क्लोजर बैकक्वॉट के अंदर नामों के लिए नेमस्पेस क्वालीफायर क्यों जोड़ रहा है?

(defn test-expr [attribute] 
    `[?entity ~attribute ?value]]) 

जब मैं चलाने (परीक्षण expr 3), मैं उत्पादन उम्मीद करेंगे:

[?entity 3 ?value] 

लेकिन बजाय, मैं

[mynamespace/?entity 3 mynamespace/?value] 

कौन सा जाहिर है जो मैं चाहता नहीं है मिलता है। क्या क्लोजर बताने का कोई तरीका है "कृपया केवल सूची उद्धृत करें और वेरिएबल्स का विस्तार करें जो मैं आपको बताता हूं?"

+1

इस कारण से, उपयोगकर्ताओं को (* खांसी * आप) को आपके द्वारा उपयोग किए जा रहे उसी नाम के साथ कार्यों और/या चर को परिभाषित करके गलती से अपने मैक्रोज़ को तोड़ने से रोकने के लिए है। – Cubic

+0

@ क्यूबिक, सहमत हुए। जहां तक ​​मैं समझता हूं, यह स्कीम हाइजीनिक मैक्रोज़ और कॉमन लिस्प सादे मैक्रो सिस्टम के बीच कुछ प्रकार का समझौता है: मैक्रो परिभाषाएं लगभग सामान्य लिस्प की तरह दिखती हैं (यह अच्छा है, क्योंकि योजना मैक्रोज़ आईएमओ लिखना कठिन होता है), लेकिन डिफ़ॉल्ट रूप से स्वच्छता के कुछ स्तर मौजूद हैं - प्रतीकों को अंधाधुंध पर कब्जा नहीं किया जाता है लेकिन इसके बजाय नामस्थान के साथ उपसर्ग किया जाता है। और जब आवश्यक हो तो सादा प्रतिस्थापन पर वापस गिरना हमेशा संभव होता है (उदाहरण के लिए एनाफोरिक मैक्रोज़ के लिए)। –

उत्तर

9

हां, वहां है।

(defn test-expr [attribute] 
    `[~'?entity ~attribute ~'?value]) 

यहाँ आप पहले वाक्य रचना उद्धरण गंदें शब्द बोलना और फिर तुरंत फिर से प्रतीक (~' निर्माण) बोली। परिणाम नामस्थान कम प्रतीक है।

यह निम्नलिखित के बराबर है, जो बताता है कि यह कैसे काम करता है:

(defn test-expr [attribute] 
    `[~(quote ?entity) ~attribute ~(quote ?value)]) 
4

क्या आप देख रहे हैं ब्रैंडन ब्लूम https://github.com/brandonbloom/backtick

द्वारा बैकटिक पुस्तकालय यह सटीक समस्या आप के लिए बनाया गया था वर्णन करते हैं। यह 'टेम्पलेट' नामक एक कमांड प्रदान करता है जो बैकटिक की तरह काम करता है लेकिन नेमस्पेसिंग सामान के बिना।

क्लोजर में, quasiquotation और नेमस्पेस रिज़ॉल्यूशन एक ही सुविधा में एक साथ मिश्रित होते हैं। क्लोजर जैसी भाषा में मैक्रोज़ लिखने के लिए इसका बहुत बड़ा लाभ है, जो एक "लिस्प -1" (सामान्य लिस्प के विपरीत है, जो कि "लिस्प -2" है, जिसमें फ़ंक्शंस और चर के लिए अलग-अलग नामस्थान हैं।)

मैं यह भी मानता हूं कि इन सुविधाओं को भंग करने के लिए बेहतर हो सकता है, लेकिन यह क्लोजर में मैक्रोज़ का लेखन कम सुरुचिपूर्ण बना देता, इसलिए मैं देख सकता हूं कि यह ऐसा क्यों करता है।

संबंधित मुद्दे

 संबंधित मुद्दे