2012-09-03 11 views
6

क्लोजर से शुरू होने पर मैंने रिच हिकी द्वारा एक वार्ता की खोज की जहां वह कुछ Ant-Simulator पर क्लोजर की ताकत का प्रदर्शन करता है।क्लोजर संदर्भ परियोजना अद्यतित?

क्या यह कोड अभी भी क्लोजर के लिए एक अच्छा संदर्भ माना जा सकता है? विशेष रूप से वे हिस्सों जब वह दोबारा गेम लूप अनुकरण करने के लिए एजेंटों को कार्यों को भेजता है। उदाहरण:

(defn animation [x] 
    (when b/running 
    (send-off *agent* #'animation)) 
    (. panel (repaint)) 
    (. Thread (sleep defs/animation-sleep-ms)) 
    nil) 

संपादित करें:

मैं #' पाठक मैक्रो में रुचि रखते हैं, लेकिन अधिक मौसम यह मुहावरेदार/ के लिए अच्छा Clojure रिकर्सिवली एक एजेंट या नहीं पर एक समारोह फोन है नहीं कर रहा हूँ।

+0

आप किस विशिष्ट कोड को पोस्ट कर सकते हैं, इसलिए कोई समस्या बताई जा सकती है, इसलिए हम आपकी मदद कर सकते हैं? अन्यथा, मैं सोच रहा हूं कि यह प्रश्न प्रोग्रामर पर निर्भर है। – octopusgrabbus

+0

'* 'पाठक मैक्रो को' * एजेंट * 'पर आवर्ती रूप से' एनीमेशन 'भेजते समय क्यों आवश्यक है? – noahlz

+2

यह हर बार उपयोग किए जाने पर 'एनीमेशन' का मूल्यांकन करता है। इस तरह 'एनीमेशन' फ्लाई –

उत्तर

3

यह स्निपेट क्लोजर 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) 

नैतिक है: तुल्यकालिक गणना के लिए एजेंटों का उपयोग नहीं करते। उन्हें अतुल्यकालिक स्वतंत्र कार्यों के लिए उपयोग करें - जैसे किसी उपयोगकर्ता को प्रदर्शित एनिमेशन अपडेट करना :)

+0

पर बदला जा सकता है धन्यवाद @ नोहाज़ –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^