2010-08-15 9 views
8

कुछ दावा करते हैं कि LISP में एक एकल नाम स्थान अस्पष्ट मैक्रोज़ की ओर जाता है। http://community.schemewiki.org/?hygiene-versus-gensymएक ऐसे नामस्थान के बारे में क्या है जो अनैसर्गिक मैक्रोज़ की ओर जाता है? (LISP में)

http://www.nhplace.com/kent/Papers/Technical-Issues.html

क्या ठीक यह, एकल दोहरी या एकाधिक नामस्थान कि मैक्रो स्वच्छता की ओर जाता है के बारे में है?

+1

क्योंकि आपको यहां तीन घंटे से कोई भी वास्तविक (वास्तविक) उत्तर नहीं मिल रहा है: आप इसे "लैम्ब्डा द अल्टीमेट" पर पूछने का प्रयास कर सकते हैं। आप शायद बाहर निकल सकते हैं क्योंकि सूची वास्तव में प्रोग्रामिंग भाषाओं पर शोध के बारे में है, लेकिन वहां लोग निश्चित रूप से आपके प्रश्न का उत्तर दे सकते हैं। http://lambda-the-ultimate.org/ – Eike

उत्तर

7

लिस्प -2 का मतलब है कि आपके पास दो नामस्थान हैं: एक कार्य के लिए, एक अन्य सामान के लिए।

इसका मतलब है कि आप एक मैक्रो में अनजाने में फ़ंक्शन मान (या var मान) को पुनर्निर्मित करने की संभावना कम हैं।

लिस्प -1 में, चूंकि एक नामस्थान है, तो आप मौजूदा परिभाषा को मारने की संभावना के अनुसार दो बार (सांख्यिकीय रूप से, लेकिन व्यावहारिक रूप से नहीं) हैं।

हकीकत में, लिस्प -1 में gensym जैसी योजनाओं और syntax-structure की योजना के भ्रमित रूप से विस्तृत सरणी है जो चीजों को स्वच्छ रखने वाले मैक्रोज़ की तरह है।

सबसे अच्छा मैं बता सकता हूं कि यह मुद्दा ज्यादातर भूसे-आदमी तर्क है: यह केवल गरीब या पुराने कार्यान्वयन में एक मुद्दा है।

Clojure के माध्यम से स्वच्छ मैक्रो प्रदान करता है gensym या पाठक मैक्रो myvar# (# अनिवार्य रूप से gensym है)।

और आप अपने मैक्रो में अपने कार्य rebinding स्थानीय क्षेत्र के बारे में चिंता करने की ज़रूरत नहीं है, या तो: यहां

user=> (defmacro rev [xs] `(reverse ~xs)) 
#'user/rev 
user=> (rev [1 2 3]) 
(3 2 1) 
user=> (let [reverse sort] (rev [1 2 5 3 6])) 
(6 3 5 2 1) 

और कुछ चर स्वच्छता है:: Clojure सब साफ है

user=> (defmacro k [] (let [x# "n"] x#)) 
#'user/k 
user=> (k) 
"n" 
user=> (let [x "l"] (k)) 
"n" 
user=> (let [x "l"] (str (k) x)) 
"nl" 

सूचना हमारी सेक्सी gensym 'डी x#

+4

असल में 'रेव' मैक्रो ज्यादातर काम करता है कि क्लोजर स्वचालित रूप से सिंटैक्स-कोट फ़ॉर्म में शाब्दिक द्वारा प्रस्तुत प्रतीकों को कैसे हल करता है, इस तथ्य के साथ-साथ नामस्थान-योग्य प्रतीकों का नाम भी नहीं हो सकता है स्थानीय ('रिवर्स' वास्तव में विस्तार में' clojure.core/reverse' बन जाता है; '(चलो [रिवर्स: foo] (rev ...))' कोई समस्या नहीं है, क्योंकि 'rev' फ़ॉर्म का विस्तार कभी भी उल्लेख नहीं करता है ' रिवर्स' - यह 'clojure.core/रिवर्स' का उल्लेख करता है)। जहां तक ​​मुझे पता है, मैक्रो स्वच्छता बहस के लिए क्लोजर का एक अभिनव योगदान है। –

+3

बेशक 'जीन्सिम' यहां बिल्कुल महत्वपूर्ण हैं, लेकिन एक पैकेज सिस्टम (पैकेज सीएल लिंगो है; क्लोजर भूमि में "नेमस्पेस" शब्द का उपयोग किया जाता है) गैर-स्वच्छता मैक्रो सैनिटी के लिए भी मौलिक है और क्लोजर का ऑटोरेसोल्विंग है जितना संभव हो उतना मदद करने के लिए इसे निचोड़ने का एक विशेष रूप से स्मार्ट तरीका। –

+2

मैं पूरी तरह से भूल गया कि सिंटैक्स-कोट पूरी तरह से प्रतीकों को हल करता है: इसके लिए धन्यवाद! मुझे लगता है कि मेरा जवाब सही है, लेकिन यह ध्यान देने योग्य एक महत्वपूर्ण/रोचक बात है। मैंने वास्तव में इस सवाल का जवाब देने के पहले के पुनरावृत्ति में इसका लाभ उठाया: http://stackoverflow.com/questions/3480377/clojure-namespace-management-is-there-a-way-to-save-and-restore -the-state-of-cl चीजों को साफ़ करने के लिए फिर से, मीकल, धन्यवाद। – Isaac

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