यह स्निपेट क्लोजर 1.4 में चालू है। क्या यह किसी फ़ंक्शन के लिए उस एजेंट को वापस सबमिट करने के लिए बेवकूफ़ है जिसे इसे बुलाया जाता है? हाँ।
(defn fac [n limit total]
(if (< n limit)
(let [next-n (inc n)]
(send-off *agent* fac limit (* total next-n))
next-n)
total))
(def a (agent 1))
(await (send-off a fac 5 1))
; => nil
@a
;=> 120
अद्यतन
ऊपर एक काल्पनिक उदाहरण एक अच्छा एक नहीं है और वास्तव में, के रूप में वहाँ है एक:
यहाँ एक उदाहरण रिकर्सिवली एक भाज्य की गणना करने के लिए एक समान दृष्टिकोण का उपयोग करता है विभिन्न रिकर्सिव send-off
कॉल और बाद में await
के बीच दौड़ की स्थिति। एजेंट की कार्य कतार में अभी तक कुछ send-off
कॉल जोड़े जा सकते हैं।
मैं फिर से लिखा ऊपर इस प्रकार है:
(defn factorial-using-agent-recursive [x]
(let [a (agent 1)]
(letfn [(calc [n limit total]
(if (< n limit)
(let [next-n (inc n)]
(send-off *agent* calc limit (* total next-n))
next-n)
total))]
(await (send-off a calc x 1)))
@a))
और निम्न व्यवहार मनाया:
कहानी का
user=> (for [x (range 10)] (factorial-using-agent-recursive 5))
(2 4 3 120 2 120 120 120 120 2)
user=> (for [x (range 10)] (factorial-using-agent-recursive 5))
(2 2 2 3 2 2 3 2 120 2)
user=> (for [x (range 10)] (factorial-using-agent-recursive 5))
(120 120 120 120 120 120 120 120 120 120)
नैतिक है: तुल्यकालिक गणना के लिए एजेंटों का उपयोग नहीं करते। उन्हें अतुल्यकालिक स्वतंत्र कार्यों के लिए उपयोग करें - जैसे किसी उपयोगकर्ता को प्रदर्शित एनिमेशन अपडेट करना :)
आप किस विशिष्ट कोड को पोस्ट कर सकते हैं, इसलिए कोई समस्या बताई जा सकती है, इसलिए हम आपकी मदद कर सकते हैं? अन्यथा, मैं सोच रहा हूं कि यह प्रश्न प्रोग्रामर पर निर्भर है। – octopusgrabbus
'* 'पाठक मैक्रो को' * एजेंट * 'पर आवर्ती रूप से' एनीमेशन 'भेजते समय क्यों आवश्यक है? – noahlz
यह हर बार उपयोग किए जाने पर 'एनीमेशन' का मूल्यांकन करता है। इस तरह 'एनीमेशन' फ्लाई –