letfn assumes fnspecs are all already properly shaped, like: (fn-name 
[args] body)

But it is possible that a macroexpansion is needed to get them in the right 
shape before letfn does its work, especially if the user found all his 
fnspecs were of similar shape and used a macro to eliminate boilerplate 
repetition. His fnspecs would be (name-of-macro macro-args) and would 
expand to (fn-name [args] body)

Original:

(defmacro letfn 
  "fnspec ==> (fname [params*] exprs) or (fname ([params*] exprs)+)

  Takes a vector of function specs and a body, and generates a set of
  bindings of functions to their names. All of the names are available
  in all of the definitions of the functions, as well as the body."
  {:added "1.0", :forms '[(letfn [fnspecs*] exprs*)],
   :special-form true, :url nil}
  [fnspecs & body] 
  `(letfn* ~(vec (interleave (map first fnspecs) 
                             (map #(cons `fn %) fnspecs)))
           ~@body))

Macro-friendly wrapper:

(defmacro letfn'
  [fnspecs & body]
  `(letfn ~(vec (map macroexpand fnspecs)) ~body))


   1. What do you think?
   2. Is the user I mentioned above using macros wisely (use case is to 
   eliminate boilerplate code)?
   

-- 
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
Note that posts from new members are moderated - please be patient with your 
first post.
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
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to