[CLJS-210] Implement Var form, var-get, and var? in CLJS Created: 27/Apr/12 Updated: 28/Oct/12
|Patch:||Code and Test|
See discussion of Vars in CLJS here: http://dev.clojure.org/display/design/Dynamic+Binding
This patch adds support for parsing the (var foo) form. The #' reader macro is provided by JVM Clojure.
#'foo emits code to construct a Var object. In this patch, each invocation of 'var will create a unique Var object. This means they are '= by fully qualified symbol, but not 'identical?. Simple memoization would fix that, but I'm not going to bother until I get to Dynamic Var objects.
The main advantage of this level of Var support is for the interactive development convenience of being able to defer dereferencing top-levels. For example, (def fog (comp f #'g)) will pick up redefinitions of 'g, but not of 'f.
|Comment by Brandon Bloom [ 28/Apr/12 10:07 PM ]|
I found two issues with this patch:
1) I never used the IVar that I declared :-P
2) (apply #'+ (range 100)) throws "Invalid arity: 101" – this is related to http://dev.clojure.org/jira/browse/CLJS-211
I'll look into fixing both. However, we should discuss supporting variable arity protocol methods...
|Comment by David Nolen [ 17/Jun/12 12:17 PM ]|
any support for reified vars is a low priority for the foreseeable future.
|Comment by Brandon Bloom [ 01/Sep/12 7:46 PM ]|
Reified vars (and binding frames!) are a requirement for a CPS transform to be correct with respect to dynamic bindings.
|Comment by Tom Jack [ 10/Sep/12 5:11 PM ]|
|Comment by Herwig Hochleitner [ 28/Oct/12 7:34 PM ]|
bound-fn could also be implemented by setting / resetting bound vars before / after the wrapped fn, similar to binding. We would just need to add tracking of the currently rebound dynamic vars.
|Comment by Tom Jack [ 28/Oct/12 9:03 PM ]|
I've considered that and would love to see it happen.
But what about: