2010-06-12 18 views
12

में विलंबित मूल्यांकन मुझे कुछ परेशानी हो रही है कि क्लोजर में delay मैक्रो कैसे काम करता है। ऐसा लगता है कि ऐसा करने की उम्मीद नहीं है (यानी: मूल्यांकन में देरी)। आप इस कोड नमूने में देख सकते हैं:क्लोजर

; returns the current time 
(defn get-timestamp [] (System/currentTimeMillis)) 

; var should contain the current timestamp after calling "force" 
(def current-time (delay (get-timestamp))) 
हालांकि

, current-time बुला में आरईपीएल तुरंत, अभिव्यक्ति का मूल्यांकन करने के भी force मैक्रो का उपयोग कर लेने के बिना प्रकट होता है:

user=> current-time 
#<[email protected]: 1276376485859> 
user=> (force current-time) 
1276376485859 

क्यों था के मूल्यांकन get-timestamp पहले force कॉल तक देरी नहीं हुई?

+1

मामूली टिप्पणी: किसी तारीख को बनाने के बजाय सीधे (सिस्टम/वर्तमान टाइममिलिस) का उपयोग करना बेहतर होता है - वे समान अंतर्निहित मिलीसेकंड स्रोत का उपयोग करते हैं लेकिन पूर्व अनावश्यक ऑब्जेक्ट आवंटन से बचाता है। – mikera

उत्तर

13

आरईपीएल में दिखाई देने वाली विभिन्न वस्तुओं का मुद्रित प्रतिनिधित्व print-method नामक एक बहुआयामी का उत्पाद है। यह क्लोजर के स्रोतों में core_print.clj फ़ाइल में रहता है, जो clojure.core नामस्थान में क्या होता है इसका हिस्सा बनता है। बातें deref/@ पर काम कर सकते हैं के लिए जावा इंटरफ़ेस - - print-method मुद्रित प्रतिनिधित्व में वस्तु के पीछे मूल्य शामिल

समस्या यहां है कि वस्तुओं clojure.lang.IDeref लागू करने के लिए है। इस अंत में, इसे deref ऑब्जेक्ट की आवश्यकता है, और हालांकि मुद्रण के लिए विशेष प्रावधान किए गए हैं एजेंटों और लंबित वायदा विफल, देरी हमेशा मजबूर होती है।

दरअसल मैं इस बग पर विचार करने के लिए इच्छुक हूं, या किसी सुधार की आवश्यकता में सबसे अच्छी स्थिति है। अभी के लिए एक कामकाज के रूप में, अनचाहे देरी मुद्रित न करने के लिए अतिरिक्त देखभाल करें।

+0

मैं निश्चित रूप से सुधार करने की कोशिश करूंगा। यह काफी सरल होना चाहिए। –

+4

मुझे लगता है कि हेइजेनबर्ग सिद्धांत क्लोजर पर भी लागू होता है: आप इसे बदलने के बिना देरी का निरीक्षण नहीं कर सकते हैं। :-) – Greg

+0

@ ग्रेग: मुझे लगता है कि आप पर्यवेक्षक प्रभाव का मतलब है। :) https://en.wikipedia.org/wiki/Observer_effect_(physics)#Quantum_mechanics – Peeja