Skip to content

Instantly share code, notes, and snippets.

@skatenerd
Created March 13, 2014 03:49
Show Gist options
  • Save skatenerd/9521613 to your computer and use it in GitHub Desktop.
Save skatenerd/9521613 to your computer and use it in GitHub Desktop.
default arguments
(defmacro make-it [name args defaults & exprs]
`(defn ~name
(~args
(~name ~@(concat args (vals defaults)))
)
(~(vec (concat args (keys defaults)))
~@exprs)))
(prn (macroexpand-1 '(make-it bar [a b] {c +} (prn "HI") (c a b))))
(make-it bar [a b] {c +} (prn "HI") (c a b))
(prn (bar 1 2))
(prn (bar 5 5 *))
@patrickgombert
Copy link

(defmacro make-it [defaults & fn-body]
  (let [body (first fn-body)
         function-name (first body)
         arguments (second body)
         argument-subset (vec (nthrest arguments (count defaults)))
         definition (rest (rest body))]
  `(defn ~function-name
     (~argument-subset
        (~function-name ~@(reverse (concat argument-subset defaults))))
     (~arguments
       ~@definition))))

(make-it [1] (show-args [a b] (str a ", " b)))
(show-args 2) ; => 1, 2
(show-args 3 4) ; => 3, 4 

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment