You mean there's no way to define bar?
Here's some context. I had a metafunction, conc:
(defn conc [& subrules]
(fn [tokens]
(loop [subrule-queue (seq subrules), remaining-tokens (seq
tokens), products []]
(if (nil? subrule-queue)
[products remaining-tokens]
(let [[subrule-products subrule-remainder :as subrule-result]
((first subrule-queue) remaining-tokens)]
(when-not (nil? subrule-result)
(recur (rest subrule-queue) subrule-remainder
(conj products subrule-products))))))))
I changed it to a macro to avoid evaluating its arguments until
needed:
(defn conc* [tokens & subrules]
(loop [subrule-queue (seq subrules), remaining-tokens (seq tokens),
products []]
(if (nil? subrule-queue)
[products remaining-tokens]
(let [[subrule-products subrule-remainder :as subrule-result]
((first subrule-queue) remaining-tokens)]
(when-not (nil? subrule-result)
(recur (rest subrule-queue) subrule-remainder
(conj products subrule-products)))))))
(defmacro conc [& subrules]
`(fn [tokens#]
(conc* tokens# ~...@subrules)))
I had another function called factor=:
(defn factor= [factor subrule]
(apply conc (replicate factor arg)))
When I changed conc to a macro, factor= didn't work anymore. Is there
no way of fixing factor=?
On Feb 7, 3:09 pm, Laurent PETIT <[email protected]> wrote:
> Hello,
>
> Is it theoretical, or do you have a concrete use case we could try to help
> you with ?
>
> 2009/2/7 samppi <[email protected]>
>
>
>
>
>
> > Let's say I have a macro:
>
> > (defmacro foo [& args] ...)
>
> > I want to do something equivalent to this:
> > (defn bar-fn [factor arg]
> > (apply foo (replicate factor arg)))
>
> > ...but since I can't take values of macros, I have to do something
> > like this, right?
>
> > (defmacro bar [factor arg]
> > `(foo ~@(replicate factor arg)))
>
> > ...but then when I use it I get a ClassCastException if I try to do
> > something like (bar (dec 5) something), because then Clojure tries to
> > evaluate (replicate '(dec 5) 'something).
>
> > So how should I rewrite bar to behave like bar-fn, then?
>
> --
> Cordialement,
>
> Laurent PETIT
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
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
-~----------~----~----~----~------~----~------~--~---