Hi all,
I've gotten myself stuck with what is probably a simple question, and
wonder if someone can advise. What I want to be able to do is to take a
symbolic expression, like '(+ 1 x) say, and turn it in to a function
programmatically, so that I can call something like:
(def ex '(+ 1 x))
(def exf (functionalise ex 'x))
(exf 3) ;; => 4
where functionalise is the thing I want to implement, and it's taking the
symbol to treat as an argument/variable in its second place. I can come up
with a nasty solution:
(defn functionalise [ex var] (fn [xp] (eval (postwalk-replace {var xp}
ex))))
but this has the significant downside that it does the walking every time
the resulting function is called!
Not being much of a macro-writer, I tried the following:
(defmacro functionalise
[ex var]
(let [arg (gensym)
body (postwalk-replace {var arg} ex)]
`(fn [~arg] ~body)))
But it doesn't work, in the sense that evaluating it gives something like (+
1 G__6779) .
Like I say I've not got much macro experience, and feel like something
hasn't clicked in my head yet. Any clues?
Thanks in advance,
Jony
--
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
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.