Una alternativa a source
(que debería estar disponible a través de clojure.repl/source
al iniciar un REPL, a partir de 1.2.0
. Si se trabaja con 1.1.0
o inferior, source
está en clojure.contrib.repl-utils
.), Para su uso REPL, en vez de mirar funciones definido en un archivo .clj
:
(defmacro defsource
"Similar to clojure.core/defn, but saves the function's definition in the var's
:source meta-data."
{:arglists (:arglists (meta (var defn)))}
[fn-name & defn-stuff]
`(do (defn ~fn-name [email protected])
(alter-meta! (var ~fn-name) assoc :source (quote ~&form))
(var ~fn-name)))
(defsource foo [a b] (+ a b))
(:source (meta #'foo))
;; => (defsource foo [a b] (+ a b))
un simple print-definition
:
(defn print-definition [v]
(:source (meta v)))
(print-definition #'foo)
#'
es sólo un reader macro, la expansión de #'foo
a (var foo)
:
(macroexpand '#'reduce)
;; => (var reduce)
Es mejor dejar caer la cabeza para deshacerse de la palabra clave defsource. (alter-meta! (Var ~ fn-name) assoc: source (drop 1 (quote ~ & form)) – haijin