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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en