हम आज हमारे कोड में एक मुद्दा पर ठोकर खाई है, और इस Clojure सवाल का जवाब नहीं दे सकता है: सख्ती से या lazilyक्लोजर की आलसी जावा/अशुद्ध कोड पर कॉल के साथ कैसे सहभागिता करती है?
Clojure अशुद्ध कोड का मूल्यांकन करता है (या जावा कोड पर कॉल)?
ऐसा लगता है कि साइड इफेक्ट्स + आलसी अनुक्रम अजीब व्यवहार का कारण बन सकते हैं।
user=> (take 5 (range)) ; (range) returns an infinite list
(0 1 2 3 4)
और Clojure दुष्प्रभाव और अशुद्ध कार्य करता है::
user=> (def value (println 5))
5 ; 5 is printed out to screen
user=> value
nil ; 'value' is assigned nil
Clojure आलसी दृश्यों है:
यहाँ हम क्या जानते हैं कि सवाल पैदा करते है साथ ही, क्लोजर जावा ऑब्जेक्ट्स पर कॉल कर सकता है, जिसमें दुष्प्रभाव शामिल हो सकते हैं। हालांकि, दुष्प्रभाव आलसी मूल्यांकन के साथ खराब बातचीत कर सकते हैं:
user=> (def my-seq (map #(do (println %) %) (range)))
#'user/my-seq
user=> (take 5 my-seq)
(0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
0 1 2 3 4)
तो यह पहले 5 तत्वों लौट आए, लेकिन सबसे पहले 31 मुद्रित!
मुझे लगता है कि जावा ऑब्जेक्ट्स पर साइड-इफेक्टिंग विधियों को कॉल करते समय भी वही समस्याएं हो सकती हैं। इससे कोड के बारे में तर्क करना और यह पता लगाना मुश्किल हो सकता है कि क्या होने जा रहा है।
अनुषंगी सवाल:
- प्रोग्रामर के लिए इसे है नज़र रखनी चाहिए और ऐसी स्थितियों को रोकने के लिए? (हां?)
- अनुक्रमों के अलावा, क्लोजर सख्त मूल्यांकन करता है? (हाँ?)
यह साइड इफेक्ट्स और आलस्य प्रश्न कैसे मिश्रण नहीं है - यह एक "व्हाओ, यह अजीब था, ऐसा क्यों हुआ और हम भविष्य में इससे कैसे बचें?" सवाल। क्या मैं आपके उत्तर को समझने में सही हूं: क्लोजर अशुद्ध/जावा कॉल का सख्ती से मूल्यांकन करता है, यह प्रोग्रामर की ज़िम्मेदारी है, और आलस्य के साथ अशुद्धता को मिश्रित नहीं करता है? –
@ मैटफ़ेनविक, मूल रूप से क्लोजर हमेशा सख्ती से मूल्यांकन करता है। आलसी seqs मूल रूप से एक ही चाल का उपयोग अपने जेनरेटर आदि के साथ पाइथन के रूप में करते हैं। आलसी कपड़े में सख्त evals। :) – progo