I put your notes here, http://dev.clojure.org/display/design/Dynamic+Binding
How are you ensuring that the binding frames are local to a particular asynchronous block of code and that they are removed when that asynchronous block of code exits? David On Tue, Feb 14, 2012 at 3:41 PM, Brandon Bloom <snprbo...@gmail.com> wrote: > Can we continue the conversation on this thread while my CA waits on the > USPS? > > Three things to cover: 1) motivation 2) design 3) impact > > 1. Why do I want this? Why would anyone want this? > - Better parity with JVM Clojure > - async Javascript (ie. nearly all Javascript) makes the binding > macro effectively useless without bound-fn > - Some common Clojure behaviors, like printing to a dynamically > bound *out*, can't currently exist across an async boundary. See > *print-fn* > in CLJS > - I'd like to create a dom manipulation library that has a *dom* > dynamic variable, which acts like current working directory for dom > manipulation functions. I've got some crazy ideas that I want to > experiment > with here, especially once I implement add-watch: I think I can achieve > pretty seamless UI data binding. > 2. Design > - Are Vars still useful without threads? > - Yes, but only dynamic vars > - async callbacks and threads have a lot of common design > considerations > - Performance > - Price is equivalent to that of JVM Clojure > - Extra indirection for def and deref > - Shared stack of dynamic binding frames > - Hash lookup on each access > - Opt-in price for the Var indirection > - Treat ^:dynamic as that opt-in mechanism; no impact for static > vars > - Potential optimization: Leverage Javascript's > prototypical inheritance instead of Frame type > - Required compiler analysis > - Metadata for resolved vars > - Not available for external libraries > - OK, because we only care about ^:dynamic vars > - Interop > - Vars declared as ^:dynamic differ from static ones: they are > wrapped in the Var type > - binding, etc are only applicable to dynamic vars, not useful > to non-ClojureScript callers > - External callers can still use deref and alter-var-root > 3. Impact > - Breaking change for binding macro > - New behavior matches JVM clojure: binding only works on > dynamic vars > - Simply marking any affected vars as ^:dynamic should be enough > to upgrade > - Potentially breaking changes for any cljs.core vars that are > changed to ^:dynamic > - *print-fn* and other printing vars > - Only breaking for Javascript interop usages, still source > compatible > > How's that? Anything I missed? Complaints? Concerns? Questions? > > Cheers, > Brandon > > -- > 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 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