basically the following is the macro that creates a function from the
expression calculated using mathematica.. it seems to be doing something
still not the whole thing.. hopefully some of you may be able to help me.
(defmacro sexp2fn [sexp]
(let [sym (eval sexp)
vars (eval (math (Variables sexp)))]
(println [sym vars])
`(fn ~vars
~sym)))
;; when I macro expand the following
(sexp2fn (mathematica-eval "D[x*x+x*y,x]"))
;; I get the error whose stack trace is
Unable to resolve symbol: sexp in this context
[Thrown class java.lang.Exception]
Restarts:
0: [QUIT] Quit to the SLIME top level
Backtrace:
0: clojure.lang.Compiler.resolveIn(Compiler.java:5677)
;; however if I replace the above macro with the following
(defmacro sexp2fn [sexp]
(let [sym (eval sexp)
vars []] ;(eval (math (Variables sexp)))]
(println [sym vars])
`(fn ~vars
~sym)))
;and I macro expand the same expression i get
(clojure.core/fn [] (+ (* 2 x) y))
; as you can see the arguments list is empty .. i would have liked to have
[x y] over there and (math (Variables (+ (* 2 x) )y) would return [x y] but
for some reason sexp is not visible .. can anybody help?
does eval have any lexical scope in which it will run or does it run in the
null-lexical scope?
Sunil.
On Wed, Oct 13, 2010 at 2:27 PM, Meikel Brandmeyer <[email protected]> wrote:
> Hi,
>
> On 13 Okt., 08:56, Laurent PETIT <[email protected]> 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 [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]<clojure%[email protected]>
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
>
--
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