Why not explicitly feed the macro the keyword map if that is what it wants?
(defmacro ultra-synth [prefix keywords]
(let [symbols (map (comp symbol name) keywords)
fn-names (map (comp symbol
(partial str prefix) name) keywords)
defn-forms (map
(fn [fn-name symbol]
`(defn ~fn-name [n#]
(= n# ~symbol)))
fn-names symbols)]
`(do ~...@defn-forms)))
thunderbolt.play> (def a 5)
#'thunderbolt.play/a
thunderbolt.play> (def b 5)
#'thunderbolt.play/b
thunderbolt.play> (ultra-synth "hi" [:a :b])
#'thunderbolt.play/hib
thunderbolt.play> (hia 5)
true
--Robert McIntyre
On Fri, Sep 10, 2010 at 6:17 PM, Alan <[email protected]> wrote:
> PS this is super-ugly and I'm always embarrassed when I find myself
> using eval in a lisp. While this works, I'd love it if someone could
> tell me how to do it with macros.
>
> On Sep 10, 3:07 pm, Alan <[email protected]> wrote:
>> I see. It's hard to imagine how this could work, since macros don't
>> have access to runtime data like the value of x in your example.
>> Perhaps you're better off writing a function that returns a closure,
>> and iteratively def'ing those?
>>
>> user=> (defn make-kw-fn [kw]
>> #(= kw %))
>> #'user/make-kw-fn
>> user=>
>> (def kws [:a :b])
>> #'user/kws
>> user=>
>> (eval (cons 'do (map #(list 'def (symbol (str "test-" (name %))) (make-
>> kw-fn %)) kws)))
>> #'user/test-b
>> user=> (test-b :a)
>> false
>> user=> (test-b :b)
>> true
>>
>> On Sep 10, 1:37 pm, icemaze <[email protected]> wrote:
>>
>> > Alan, thank you for your reply.
>> > Unfortunately your solution is very similar to mine and it suffers
>> > from the same problem (maybe I'm using it incorrectly, I don't know).
>> > If I write:
>>
>> > (doseq [x '(:a :b)]
>> > (make-fn x))
>>
>> > it defines a single function "synthetic-x". Is there a way to make
>> > this work? I tried everything but both eval and var-get don't work for
>> > local bindings.
>>
>> > Thanks again.
>>
>>
>
> --
> 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 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