[CLJS-210] Implement Var form, var-get, and var? in CLJS Created: 27/Apr/12 Updated: 28/Oct/12 |
|
| Status: | Open |
| Project: | ClojureScript |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Brandon Bloom | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | patch, | ||
| Attachments: |
|
| Patch: | Code and Test |
| Description |
|
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. |
| Comments |
| 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 ] |
|
+1 towards bound-fn and friends. I had an explanation written here but now I see "async Javascript (ie. nearly all Javascript) makes the binding macro effectively useless without bound-fn". Indeed. |
| 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: (def ^:dynamic *foo* 3) (set! *foo* 4) (def f (bound-fn [] *foo*)) (set! *foo* 5) (f) |