Hi again,

Am 05.06.2009 um 00:06 schrieb Meikel Brandmeyer:

The docstring is a bit contorted but I'm too sleepy now,
to get that right...

And of course I'm too sleepy to miss the keyword to
symbol conversion....

(defmacro defnk
"Define a function accepting keyword arguments. Symbols up to the first keyword in the parameter list are taken as positional arguments. Then an alternating sequence of keywords and defaults values is expected. The
  values of the keyword arguments are available in the function body by
virtue of the symbol corresponding to the keyword (cf. :keys destructuring). defnk accepts an optional docstring as well as an optional metadata map."
  [fn-name & fn-tail]
  (let [[fn-name [args & body]] (name-with-attributes fn-name fn-tail)
        [pos kw-vals]           (split-with symbol? args)
syms (map #(-> % name symbol) (take-nth 2 kw-vals))
        values                  (take-nth 2 (rest kw-vals))
sym-vals (apply hash-map (interleave syms values))
        de-map                  {:keys (vec syms)
                                 :or   sym-vals}]
    `(defn ~fn-name
       [...@pos & options#]
       (let [~de-map (apply hash-map options#)]
         ~...@body))))

Sincerely
Meikel

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to