let
छाया एक साथ उच्चस्तरीय वार x
लौटे स्थानीय x
। let
कोई वर नहीं बनाता है या अपरिवर्तनीय Var को प्रभावित नहीं करता है; यह कुछ प्रतीक को बांधता है जैसे कि उस प्रतीक के स्थानीय संदर्भ let
-bound मान के साथ प्रतिस्थापित किए जाएंगे। let
में लक्सिकल स्कोप है, इसलिए इसकी बाइंडिंग केवल let
फॉर्म के भीतर दिखाई दे रही है (let
के भीतर से फ़ंक्शंस में नहीं)।
binding
अस्थायी रूप से (थ्रेड-स्थानीय रूप से) अपूर्ण Var x
के मान को बदलता है, यह सब कुछ करता है। यदि let
बाध्यकारी जगह पर है, binding
यह तय करते समय यह नहीं देखता कि कौन सा मान बदलना है (और let
की बाइंडिंग वर्र्स नहीं हैं और वे बदलाव नहीं कर रहे हैं, ताकि 'अच्छी बात हो या यह आपको त्रुटि दे)। और binding
let
मास्क नहीं करेगा। binding
में गतिशील गुंजाइश है, इसलिए यह binding
फ़ॉर्म के भीतर और binding
फ़ॉर्म के भीतर से किसी भी फ़ंक्शन में दिखाई देने वाले अपरिवर्तित वार्स पर प्रभाव डालता है।
सादे पुराने x
का मूल्य तक पहुँचना आप लौटा देंगे बाइंडिंग के ढेर के शीर्ष पर है, या तो सबसे नेस्टेड let
x
की -bound मूल्य (या समारोह परमाटर x
कहा जाता है, या कुछ मूल्य x
साथ बदल दिया है यदि आप अपने स्वयं के मैक्रो, या अन्य संभावनाओं का उपयोग करते हैं।), और डिफ़ॉल्ट रूप से अपरिवर्तित Var x
के वर्तमान मान का उपयोग केवल तभी किया जाता है जब कोई अन्य बाध्यकारी न हो।
यहां तक कि अगर उच्चस्तरीय वार x
एक let
-bound x
के नीचे दब जाता है, तो आप हमेशा उच्चस्तरीय वार @#'x
के माध्यम से पहुँच सकते हैं। इस संस्करण का प्रयास करें, हो सकता है इसे और अधिक समझ बनाने होंगे:
(def x 1)
(defn dummy-fn2[]
(println "x from dummy-fn2:" x)
(+ x 1))
(defn dummy-fn[]
(println "entering function:" x)
(println "var x:" @#'x)
(dummy-fn2)
(println "---")
(let [x 100]
(println "after let:" x)
(println "var x:" @#'x)
(dummy-fn2)
(println "---")
(let [x (dummy-fn2)]
(println "after let and dummy-fn2:" x)
(println "var x:" @#'x)
(dummy-fn2)
(println "---")
(binding [x 888]
(println "after binding:" x)
(println "var x:" @#'x)
(dummy-fn2)
(println "---")
(let [x (dummy-fn2)]
(println "after binding and dummy2:" x)
(println "var x:" @#'x)
(dummy-fn2)
(println "---"))))))
देता है:
entering function: 1
var x: 1
x from dummy-fn2: 1
---
after let: 100
var x: 1
x from dummy-fn2: 1
---
x from dummy-fn2: 1
after let and dummy-fn2: 2
var x: 1
x from dummy-fn2: 1
---
after binding: 2
var x: 888
x from dummy-fn2: 888
---
x from dummy-fn2: 888
after binding and dummy2: 889
var x: 888
x from dummy-fn2: 888
---
स्रोत
2009-11-21 07:31:44
आदेश प्रलेखन दोहरा, शायद आप का वर्णन कर सकता है कि आप क्या उम्मीद और क्यों यह वास्तव में होता है से अलग है से बचने के लिए । –