I used to think the same, until I wrote the current incarnation of the go
macro in core.async. A few months back I ripped out all global vars (and
bindings). The go "compiler" is now functionally pure, except for a single
atom on the edge that counts locals. More and more I'm convinced that
dynamic vars, while pragmatic, are used way more often than they should be.

A classic example, is this OP use case, why are we storing a url in a
public dynamic var?


Timothy

On Thu, Sep 5, 2013 at 10:08 AM, David Nolen <dnolen.li...@gmail.com> wrote:

> Your example doesn't accomplish what dynamic binding does. You don't need
> to look much further than Clojure / ClojureScript compilers to see cases
> where trying to propagate information through an environment like you are
> with ctx is absolutely too tedious, the aspect oriented nature of binding
> is really what you want.
>
> David
>
>
> On Thu, Sep 5, 2013 at 1:03 PM, Timothy Baldridge <tbaldri...@gmail.com>wrote:
>
>> That can easily be done thusly:
>>
>> (defn do-stuff [ctx c]
>>    (go (loop []
>>             (let [v (<! c)]
>>               (swap! ctx process v)
>>               (recur)))
>>    (go (loop []
>>             (let [v (<! c)]
>>               (swap! ctx process v)
>>               (recur)))
>>    (go (loop []
>>             (let [v (<! c)]
>>               (swap! ctx process v)
>>               (recur))))))
>>
>> What am I missing here? Every time I've thought I needed binding, I've
>> been able to find a cleaner, more functionally pure way of doing it that
>> didn't require binding.
>>
>> Timothy
>>
>>
>> On Thu, Sep 5, 2013 at 9:01 AM, David Nolen <dnolen.li...@gmail.com>wrote:
>>
>>> I actually disagree a here as core.async brings a pretty nice
>>> concurrency model into play - I suspect there are instances where you might
>>> want to construct a series of go blocks with some shared context that you'd
>>> rather not put into every go loop.
>>>
>>> In anycase improved binding support is something I'd like to see in
>>> ClojureScript and I don't see the downside of keeping the core.async
>>> behavior the same between Clojure and ClojureScript.
>>>
>>>
>>> On Thu, Sep 5, 2013 at 11:30 AM, Timothy Baldridge <tbaldri...@gmail.com
>>> > wrote:
>>>
>>>> As David said, binding preservation works with Clojure, not with
>>>> ClojureScript. That being said, while I can see a use for bindings in
>>>> Clojure (thread-local redef), I fail to see a use-case for binding in
>>>> ClojureScript. Seems like code could/should be structured in a better way.
>>>>
>>>>
>>>> On Thu, Sep 5, 2013 at 7:54 AM, Jacek Lach <jacek.k.l...@googlemail.com
>>>> > wrote:
>>>>
>>>>> That is not what happens in lein repl:
>>>>>
>>>>> user=> (use 'clojure.core.async)
>>>>> nil
>>>>> user=> (def pingc (chan))
>>>>> #'user/pingc
>>>>> user=> (def ^:dynamic *text* "OUPS BAD ASYNC")
>>>>> #'user/*text*
>>>>> user=> (binding [*text* "good boy"]
>>>>>   #_=>   (go (while true
>>>>>   #_=>         (<! pingc)
>>>>>   #_=>         (println *text*))))
>>>>> #<ManyToManyChannel
>>>>> clojure.core.async.impl.channels.ManyToManyChannel@79d236c2>
>>>>> user=> (defn ping [] (put! pingc :ping))
>>>>> #'user/ping
>>>>> user=> (ping)
>>>>> good boy
>>>>> nil
>>>>>
>>>>> It's of course up to core.async to preserve bindings within its body.
>>>>> But since it tries to pretend to run your `go` code 'as if it was
>>>>> synchronous', that's probably desirable?
>>>>>
>>>>>
>>>>> On Thursday, September 5, 2013 3:48:10 PM UTC+1, Meikel Brandmeyer
>>>>> (kotarak) wrote:
>>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> Am Donnerstag, 5. September 2013 16:36:37 UTC+2 schrieb Mathias
>>>>>> Picker:
>>>>>>>
>>>>>>> I just tried this test case (from Anderkent on IRC):
>>>>>>>
>>>>>>> (def pingc (chan))
>>>>>>>
>>>>>>> (def ^:dynamic *text* "OUPS BAD ASYNC")
>>>>>>>
>>>>>>> (binding [*text* "good boy"]
>>>>>>>   (go (while true
>>>>>>>         (<! pingc)
>>>>>>>         (js/alert *text*))))
>>>>>>>
>>>>>>> (defn ping []
>>>>>>>   (put! pingc :ping))
>>>>>>>
>>>>>>> (ping)
>>>>>>>
>>>>>>> and I get "OUPS BAD ASYNC".
>>>>>>>
>>>>>>> So, is this bug in cljs core.async?
>>>>>>>
>>>>>>>
>>>>>> This is to be expected, because the binding is reverted after the go
>>>>>> call returns. So the code in the go block (executed later on) sees the 
>>>>>> old,
>>>>>> initial binding.
>>>>>>
>>>>>> Meikel
>>>>>>
>>>>>>
>>>>>  --
>>>>> --
>>>>> 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/groups/opt_out.
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> “One of the main causes of the fall of the Roman Empire was
>>>> that–lacking zero–they had no way to indicate successful termination of
>>>> their C programs.”
>>>> (Robert Firth)
>>>>
>>>> --
>>>> --
>>>> 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/groups/opt_out.
>>>>
>>>
>>>  --
>>> --
>>> 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/groups/opt_out.
>>>
>>
>>
>>
>> --
>> “One of the main causes of the fall of the Roman Empire was that–lacking
>> zero–they had no way to indicate successful termination of their C
>> programs.”
>> (Robert Firth)
>>
>> --
>> --
>> 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/groups/opt_out.
>>
>
>  --
> --
> 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/groups/opt_out.
>



-- 
“One of the main causes of the fall of the Roman Empire was that–lacking
zero–they had no way to indicate successful termination of their C
programs.”
(Robert Firth)

-- 
-- 
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/groups/opt_out.

Reply via email to