2011-02-02 7 views
10

मुझे यह समझना था कि क्लोजर के *assert* चर का उपयोग दावे को बंद करने के लिए किया जा सकता है, लेकिन ऐसा कुछ भी नहीं है जो मुझे लगता है।क्लोजर सम्मान `* assert *` variable कैसे बनाएं?

(binding [*assert* false] 
    (defn bar [a] 
    {:pre [(pos? a)]} 
    (assert (even? a)) 
    [a])) 

(bar 1) 
!! execption 

और फिर चर प्रत्यक्ष काम नहीं कर रहा है और भी स्थापित करने के लिए:

(defn foo [a] 
    {:pre [(pos? a)]} 
    (assert (even? a)) 
    [a]) 

(binding [*assert* false] 
    (foo 1)) 
!! exception 

(binding [*assert* false] 
    (foo -2)) 
!! exception 

भी बाध्यकारी false जब परिभाषित करने के लिए एक ही समस्या है।

*assert* 
is true 

(alter-var-root (var *assert*) not) 
*assert* 
is still true 

और

(var-set (var *assert*) false) 
*assert* 
is still true 

तो अब मैं समझ नहीं कर रहा हूँ कि क्या करना है। मैं उलझन में हूं।

धन्यवाद।

उत्तर

13

*assert* एक संकलन समय परिवर्तनशील है, रनटाइम वैरिएबल नहीं। इसका उपयोग set! के साथ शीर्ष-स्तरीय कथन के रूप में किया जाना है, बाध्यकारी के साथ नहीं (बेशक जब तक आप बाध्यकारी के अंदर eval पर कॉल नहीं करते)।

4

जोर से मैक्रो परिभाषित किया गया है, * जोर * विस्तार समय पर इसके व्यवहार को प्रभावित करता है।

आप इसे अपेक्षा के अनुरूप काम होगा इस कोड की कोशिश करता है, तो:

(binding [*assert* false] 
    (eval '(assert false)) 
) 

और साथ वर-सेट भी काम करना चाहिए अपने उदाहरण:

(var-set (var *assert*) false) 
(assert false) 
+0

यह काम करता है। आप पर्यावरण चर के परीक्षण के द्वारा गतिशील रूप से इसे बंद कर सकते हैं। – Virmundi

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