On Feb 15, 12:03 pm, Аркадий Рост <[email protected]> wrote:
> oh wait...I take a look on binding and with-binding*
> realesation.http://github.com/richhickey/clojure/blob/f4c58e3500b3668a0941ca21f9a...
> Why with-binding* function wasn't write like this:
> (defn with-bindings*
> [bindings f & args]
> (assert-args binding
> (vector? bindings) "a vector for its binding"
> (even? (count bindings)) "an even number of forms in binding
> vector")
> (let [var-ize (fn [var-vals]
> (loop [ret [] vvs (seq var-vals)]
> (if vvs
> (recur (conj (conj ret `(var ~(first vvs)))
> (second vvs))
> (next (next vvs)))
> (seq ret))))]
> (push-thread-bindings (hash-map ~@(var-ize bindings)))
> (try
> (apply f args)
> (finally
> (pop-thread-bindings))))
That function is very confused. You're trying to use a splice outside
of a syntax-quote which will not work. Even if you called simply "(var-
ize bindings)", you would end up calling something like (push-thread-
bindings (hash-map (quote [(var 3) something, (var "blah")
something]))) because the bindings vector is evaluated.
The binding operator is a macro, and it can work with the symbols
passed to it and transform the input to code that uses the var
operator, but the with-bindings* operator is a function, which means
it can't use var on its parameters. If you wanted to pass symbols to
with-bindings*, you would have to do it like (with-bindings* ['a 3, 'b
4]) and the functions would have to use resolve internally to
transform the vector into a map of vars to bindings.
As far as I can tell, binding could be implemented using with-bindings
like so:
(defmacro binding [bindings & body]
; var-ize elided; assume it exists
`(with-bindings*
~(apply hash-map (var-ize bindings))
(fn [] ~...@body)))
--
Jarkko
--
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