Perfect. This is exactly what I need. Thank you. :) I wonder, is it customary to append an * to the names of functions that do the grunt work of corresponding macros?
On Feb 6, 10:03 am, Christophe Grand <christo...@cgrand.net> wrote: > 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 clojure@googlegroups.com To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---