8

हम आज हमारे कोड में एक मुद्दा पर ठोकर खाई है, और इस 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 मुद्रित!

मुझे लगता है कि जावा ऑब्जेक्ट्स पर साइड-इफेक्टिंग विधियों को कॉल करते समय भी वही समस्याएं हो सकती हैं। इससे कोड के बारे में तर्क करना और यह पता लगाना मुश्किल हो सकता है कि क्या होने जा रहा है।


अनुषंगी सवाल:

  • प्रोग्रामर के लिए इसे है नज़र रखनी चाहिए और ऐसी स्थितियों को रोकने के लिए? (हां?)
  • अनुक्रमों के अलावा, क्लोजर सख्त मूल्यांकन करता है? (हाँ?)

उत्तर

8

क्लोजर के आलसी seqs लगभग 30 आइटम खंडित करते हैं तो थोड़ा ओवरहेड और कम हो जाता है। यह शुद्धवादी की पसंद नहीं बल्कि एक व्यावहारिक है। समय पर एक तत्व को समझने के लिए एक सामान्य समाधान के लिए "क्लोजर की खुशी" से परामर्श लें।

आलसी seqs आपके सामने आने वाले कारणों के लिए अशुद्ध कार्यों के लिए एक आदर्श मैच नहीं हैं।

क्लोजर भी सख्ती से मूल्यांकन करेगा, लेकिन मैक्रोज़ चीजों के साथ थोड़ा अलग है। if जैसे बिल्टिन स्वाभाविक रूप से मूल्यांकन करेंगे।

+2

यह साइड इफेक्ट्स और आलस्य प्रश्न कैसे मिश्रण नहीं है - यह एक "व्हाओ, यह अजीब था, ऐसा क्यों हुआ और हम भविष्य में इससे कैसे बचें?" सवाल। क्या मैं आपके उत्तर को समझने में सही हूं: क्लोजर अशुद्ध/जावा कॉल का सख्ती से मूल्यांकन करता है, यह प्रोग्रामर की ज़िम्मेदारी है, और आलस्य के साथ अशुद्धता को मिश्रित नहीं करता है? –

+3

@ मैटफ़ेनविक, मूल रूप से क्लोजर हमेशा सख्ती से मूल्यांकन करता है। आलसी seqs मूल रूप से एक ही चाल का उपयोग अपने जेनरेटर आदि के साथ पाइथन के रूप में करते हैं। आलसी कपड़े में सख्त evals। :) – progo

2

आलसी संरचनाओं का मूल्यांकन तब भी किया जाता है जब कार्यान्वयन के लिए सुविधाजनक हो, इससे कोई फर्क नहीं पड़ता कि उनमें क्या संदर्भ है। तो, हाँ, यह प्रोग्रामर पर सावधान रहना चाहिए और जरूरत पड़ने पर आलसी seqs को महसूस करने के लिए मजबूर होना चाहिए।

मुझे नहीं पता कि सख्त मूल्यांकन से आपका क्या मतलब है।

+0

http://en.wikipedia.org/wiki/Strict_evaluation –

+1

ठीक है, जैसा कि प्रोगो ने कहा था, क्लोजर सख्ती से मूल्यांकन करता है; * फ़ंक्शन कॉल और बाइंडिंग के लिए *। मैक्रोज़ जो कुछ भी उनके तर्कों के साथ पसंद कर सकते हैं। (आलसी) seqs abstractions हैं और सख्त/उत्सुक मूल्यांकन वास्तव में उन पर सीधे लागू नहीं होता है; एक आलसी seq खुद का मूल्यांकन करता है - यह केवल तब होता है जब आप उन तत्वों की जांच करने का प्रयास करते हैं, जिन्हें आप निश्चित करते हैं कि उन मानों को महसूस किया जाता है (हालांकि यह पहले से ही हो सकता है)। –