LoL lets you write:
(with-cxrs
(blah (foo (bar (cadddar x)))))
ie, it looks in your source, sees what you need defined, and makes a
letfn.
This looked fun, so I banged out an implementation:
(defn cxr-impl [name]
(when-let [op (second (re-matches #"c([ad]+)r" name))]
`(comp ~@(map {\a `first \d `rest} op))))
(defmacro with-cxrs [& body]
(let [symbols (remove coll? (tree-seq coll? seq body))]
`(let [~@(for [sym symbols
:let [impl (cxr-impl (name sym))]
:when impl
thing [sym impl]]
thing)]
~@body)))
user> (macroexpand-1 '(with-cxrs (inc (caadaaddadr x))))
(let [caadaaddadr (comp first first rest first first rest rest first
rest)]
(inc (caadaaddadr x)))
On Nov 30, 11:27 pm, Tassilo Horn <[email protected]> wrote:
> Peter Danenberg <[email protected]> writes:
>
> Hi Peter,
>
> > Try as I might, I can't purge these anachronisms; so here are `car' to
> > `cddddr' in all their glory:
>
> > http://clojars.org/cadr
>
> Nice. :-)
>
> > This implementation uses a Kleene-closure around the alphabet {a, d}
> > to generate the names; and a macro to define them:
>
> > https://github.com/klutometis/cadr/blob/master/src/cadr/core.clj
>
> Is that inspired by the `cxr' macro (I think, that was its name) in Let
> Over Lambda? One nice feature that seems missing from your version is a
> macro for defining local functions on demand. I don't remember the
> exact LoL syntax, but probably it would look something like that:
>
> (with-cxrs [foo caaaddddddaddr,
> bar caddddddddaaaaaaaar]
> (cons (foo myseq) (bar mysec)))
>
> Bye,
> Tassilo
--
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