Альтернатива source
(которая должна быть доступна через clojure.repl/source
при запуске REPL, начиная с 1.2.0
. Если вы работаете с 1.1.0
или ниже, source
находится в clojure.contrib.repl-utils
. ), для использования REPL, вместо просмотра функций, определенных в файле .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 ~@defn-stuff)
(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))
Простой print-definition
:
(defn print-definition [v]
(:source (meta v)))
(print-definition #'foo)
#'
- это просто макрос для чтения , расширяющийся с #'foo
до (var foo)
:
(macroexpand '#'reduce)
;; => (var reduce)