2012-01-14 20 views
7

जब कोई प्रतीक हल किया जा सकता है तो मुझे कुछ अजीब व्यवहार मिलता है।क्लोजर: संकल्प घोषित करता है

user=> ok 
CompilerException java.lang.RuntimeException: Unable to resolve symbol: ok in this context, compiling:(NO_SOURCE_PATH:0) 
user=> (resolve 'ok) 
nil 
user=> (if (resolve 'ok) "bla" (def ok 'ok)) 
"bla" 
user=> ok 
#<Unbound Unbound: #'user/ok> 
user=> (def ok 'ok) 
#'user/ok 
user=> ok 
ok 

क्या कोई मुझे बता सकता है कि यह कहां से आ सकता है? क्या यह व्यवहार इरादा है?

+0

क्लोजर का आप किस संस्करण का उपयोग कर रहे हैं? मुझे यह 1.2.1 – spacemanaki

+1

@ स्पेसमानकी पर नहीं दिख रहा है: दिलचस्प है, मैंने इसे 1.2.1 और 1.3 दोनों में पुन: उत्पन्न किया है, कुछ अजीब निश्चित रूप से हो रहा है। –

+0

मेरी गलती, 'ओके' के दूसरे संदर्भ के परिणामस्वरूप '# 'ऑब्जेक्ट लौटने की बजाय अपवाद हुआ, और मैंने ध्यान नहीं दिया। मेरे लिए, 1.2.1 '(' ठीक 'ठीक करें' 'if' के अंदर 'ठीक' घोषित किया गया है। – spacemanaki

उत्तर

4

(def ok "whatever")okनामक एक चर का निर्माण पर संकलित करता है। कंपाइलर पूरे फॉर्म को संकलित करने के लिए स्कैन करता है, यह पता लगाता है कि आप ok नामक एक var को परिभाषित करेंगे, और आपके फॉर्म को वास्तव में निष्पादित करने से पहले, इसे आपके लिए (बिना बाध्यकारी) बनाता है। जब def फ़ॉर्म वास्तव में निष्पादित किया जाता है, तो अभिव्यक्ति का रनटाइम मान var user/ok को असाइन किया जाएगा। आपके उदाहरण में, यह कभी नहीं होता है, क्योंकि var पहले ही बनाया जा चुका है, और if शाखा दूसरी तरफ जाती है।

एक विकल्प के रूप में bound? का उपयोग करना एक भयानक विचार है, क्योंकि यह कुछ अलग परीक्षण करता है: चाहे नामित var (जो मौजूद होना चाहिए) में बाध्यकारी, या तो स्थायी या थ्रेड-लोकल हो।

+0

तार्किक लगता है। लेकिन फिर क्यों (यदि (x 'x) x (def x' x) x (def x 'x))' उपज 'compilerException java.lang.RuntimeException: प्रतीक को हल करने में असमर्थ: x इस संदर्भ में संकलन: (NO_SOURCE_PATH: 1) '? या वह परिवर्तनीय बनाता है इससे पहले कि वह एक्स का मूल्यांकन करने की कोशिश करता है? –

1

के बाद से मैं केवल एक मैक्रो में किसी एक के लिए इसका इस्तेमाल के रूप में

(defmacro bla [x] 
    (if (resolve x) x `(def ~x '~x))) 

इस प्रकार है और अब यह काम करता है के बाद से डीईएफ़ उद्धृत प्रपत्र के अंदर है और संकल्प के बाद का मूल्यांकन अब मैं इसका इस्तेमाल।