ठीक में एक लेटेड वैरिएबल को फिर से परिभाषित करना ठीक है। मैं क्लोजर के साथ tinkering रहा है और मैं लगातार एक ही समस्या में भागते हैं। के कोड का यह छोटा टुकड़ा लेते हैं:क्लोजर लूप
(let [x 128]
(while (> x 1)
(do
(println x)
(def x (/ x 2)))))
अब मैं इस एक दृश्य बाहर मुद्रित करने के लिए 128 के साथ के रूप में तो शुरू करने की उम्मीद:
128
64
32
16
8
4
2
इसके बजाय, यह एक अनंत लूप है, अधिक से अधिक 128 मुद्रण। स्पष्ट रूप से मेरा इरादा दुष्प्रभाव काम नहीं कर रहा है।
तो मुझे इस तरह के लूप में एक्स के मान को फिर से परिभाषित करने के लिए कैसे माना जाता है? मुझे एहसास है कि यह लिस्प की तरह नहीं हो सकता है (मैं एक अज्ञात फ़ंक्शन का उपयोग कर सकता हूं जो शायद अपने स्वयं के रिकर्स पर हो), लेकिन अगर मुझे यह पता नहीं चलता कि इस तरह चर सेट करने के लिए, मैं पागल हो जाऊंगा।
मेरा दूसरा अनुमान सेट का उपयोग करना होगा! लेकिन यह "अमान्य असाइनमेंट लक्ष्य" देता है, क्योंकि मैं बाध्यकारी रूप में नहीं हूं।
कृपया मुझे यह बताएं कि यह कैसे काम करना है।
धन्यवाद। मुझे एहसास हुआ कि मेरा रास्ता लिस्पी नहीं था, क्योंकि साइड इफेक्ट्स पर फंसे हुए हैं। मैं कुछ (एक परियोजना यूलर समस्या) के माध्यम से हैकिंग कर रहा था और काम करने के लिए उस साधारण परीक्षण मामले को नहीं मिला, साबित कर रहा था कि मुझे कुछ समझ में नहीं आया। सहायता के लिए धन्यवाद। मैं भूल गया था कि लूप दोबारा पकड़ सकता है, जो बहुत साफ तरीके से काम करता है (अतिरिक्त कार्य बिना रिकर्सन के)। – MBCook
साइड इफेक्ट्स लिस्पी हैं जिन पर आप लिस्प देख रहे हैं। सामान्य लिस्प में आप दूर हो जाएंगे (x = 128 के लिए लूप (/ x 2) जबकि (> x 1) करें (प्रिंट x) करें)। लेकिन दुष्प्रभाव क्लोजुरिश नहीं हैं। –
यह बहुत पुराना है लेकिन यह एक बहुत अच्छा जवाब है, मैं क्लोजर के लिए नया हूं, इसने मुझे एक ही समस्या के साथ संघर्ष के घंटों से बचाया। बहुत बहुत धन्यवाद @ ब्रायन कैपर – shan