samppi a écrit :
> Thanks for the reply. I've tried delays, but it seemed to make my
> functions much slower. I think I'm going to go with var-quoting—it
> seems to be the least intrusive option, and it definitely works. My
> nightmare is finally over. :)
>
> I wonder if there's a way to make a macro make even this unneeded for
> the end-user, though.
>
Yup, elaborating on my third option:
(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)))))))
(defn alt* [tokens & subrules]
(some #(% tokens) subrules))
(defmacro conc [& subrules]
`(fn [tokens#]
(conc* tokens# ~...@subrules)))
(defmacro alt [& subrules]
`(fn [tokens#]
(alt* tokens# ~...@subrules)))
(declare value)
(def array (conc array-start value array-sep value array-end))
(def value (alt array bit))
Christophe
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---