Hi,

On 13 Okt., 08:56, Laurent PETIT <laurent.pe...@gmail.com> wrote:

> So in short: calling eval from the macro, on its argument.

Beware the leopard!

user=> (defn f
         [constant]
         `(+ x# (* ~constant y#)))
#'user/f
user=> (defn variables*
         [form]
         (if (seq? form)
           (reduce into [] (map variables* form))
           (when (and (symbol? form) (nil? (resolve form)))
             [form])))
#'user/variables*
user=> (defmacro variables
         [form]
         `(variables* (quote ~form)))
#'user/variables
user=> (defmacro dynamic?-variables
         [form]
         `(variables ~(eval form)))
#user/dynamic?-variables
user=> (dynamic?-variables '(+ x (* 2 y)))
[x y]
user=> (dynamic?-variables (+ x (* 2 y)))
java.lang.Exception: Unable to resolve symbol: x in this context
(NO_SOURCE_FILE:18)
user=> (dynamic?-variables (f 2))
[x__12__auto__ y__13__auto__]
user=> (let [x 2] (dynamic?-variables (f x)))
java.lang.InstantiationException: user$eval48$eval49__50
(NO_SOURCE_FILE:52)

One has to be aware of the limitations of such an approach.

Sincerely
Meikel

-- 
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

Reply via email to