Hello, I forgot a parenthesis :-P

(defrecord MyComputeComponent [factor mydatacomp]
  component/Lifecycle
  (start [this]
    (println "Starting MyComputeComponent")
    this)
  (stop [this]
    (println "Stopping MyComputeComponent")
    (dissoc this :mydatacomp)))

El miércoles, 18 de enero de 2017, 10:56:37 (UTC-6), Jose Figueroa Martinez 
escribió:
>
> Hello, your code is acting ok, as you are not dissocing the data component 
> from the compute component during its "stop" method .
>
> Remember, this is not object oriented programming. You removed the data 
> from the data component, but did nothing to the compute component. That is 
> the reason why the compute component still have a "copy" of the data 
> component with the old data.
>
> If you want the "correct" behavior (depends of what you want) then your 
> compute component should look like this:
>
> (defrecord MyComputeComponent [factor mydatacomp]
>   component/Lifecycle
>   (start [this]
>     (println "Starting MyComputeComponent")
>     this)
>   (stop [this]
>     (println "Stopping MyComputeComponent")
>     (dissoc this :mydatacomp))  ;; or (assoc this :mydatacomp nil))
>
>
> Saludos!
>
>
>
> El miércoles, 18 de enero de 2017, 8:28:24 (UTC-6), Jochen escribió:
>>
>> Hi…
>>
>> playing around with Stuart Sierras component library I found some 
>> behavior (code at end) that I find odd.
>> M sample has just two components, data and compute, where data is 
>> injected into compute. On start data associates a data map and on stop 
>> dissociates it.
>> compute uses a value from data's map to compute.
>>
>> What I found is that after system stop the started version of data is 
>> still associated to compute, while the data component in SystemMap is 
>> stopped. So, when do
>>
>>   (def my-system (make-my-system {:factor 2}))
>>   (alter-var-root #'my-system component/start-system)
>>   (alter-var-root #'my-system component/stop-system)
>>   (my-compute (:mycomputecomp my-system) 16)  
>>
>> my-compute should (as data map is nil'ed on stop) crash but doesn't.
>>
>> Calling
>>
>>   (alter-var-root #'my-system component/stop-system)
>>
>> again fixes it and my-compute crashes as expected.
>>
>> Any ideas?
>>
>> Ciao
>>
>> …Jochen
>>
>> (ns foo.core
>>   (:require [com.stuartsierra.component :as component]))
>>
>> (defrecord MyDataComponent [data]
>>   component/Lifecycle
>>   (start [this]
>>     (println "Starting MyDataComponent")
>>     (assoc this :data {:foo 42}))
>>   (stop [this]
>>     (println "Stopping MyDataComponent")
>>     (dissoc this :data)))
>>
>> (defn my-data-component []
>>   (->MyDataComponent nil))
>>
>> (defn mydatacomp-foo [mydatacomp]
>>   (get-in mydatacomp [:data :foo]))
>>
>>
>> (defrecord MyComputeComponent [factor mydatacomp]
>>   component/Lifecycle
>>   (start [this]
>>     (println "Starting MyComputeComponent")
>>     this)
>>   (stop [this]
>>     (println "Stopping MyComputeComponent")
>>     this))
>>
>> (defn my-compute-component [factor]
>>   (map->MyComputeComponent {:factor factor}))
>>
>> (defn my-compute [mycomputecomp offset]
>>   (let [factor (:factor mycomputecomp)
>>         foo    (mydatacomp-foo (:mydatacomp mycomputecomp))]
>>     (+ (* factor foo) offset)))
>>
>> (defn make-my-system [config-options]
>>   (let [{:keys [factor]} config-options]
>>     (component/system-map
>>       :mydatacomp (my-data-component)
>>       :mycomputecomp (component/using
>>                        (my-compute-component factor)
>>                        [:mydatacomp]))))
>>
>>
>> ;;;;;; running 
>> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
>> (comment
>>   (def my-system (make-my-system {:factor 2}))
>>   (alter-var-root #'my-system component/start-system)
>>   (alter-var-root #'my-system component/stop-system)
>>   (my-compute (:mycomputecomp my-system) 16)
>>   )
>>
>>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to