В Clojure 1.2 вы можете использовать функцию print-doc
:
(print-doc #'fisrt)
вот так
(map print-doc [#'fisrt #'+])
#'fisrt
совпадает с (var first)
.
Обратите внимание, что это не будет работать для специальных форм: (doc def)
работает, но (print-doc #
def) `дает:
java.lang.Exception: Unable to resolve var: def in this context (NO_SOURCE_FILE:7)
Это потому, что специальные формы не определены в vars.Вы можете увидеть, как для них работает документ, используя macroexpand-1
:
user=> (macroexpand-1 '(doc def))
(clojure.core/print-special-doc (quote def) "Special Form" (clojure.core/special-form-anchor (quote def)))
В Clojure 1.3 print-doc
перемещается в пространство имен clojure.repl
и является закрытым, поэтому вы не можете выполнить его напрямую.Вы можете ввести ns:
user=> (in-ns 'clojure.repl)
clojure.repl=> (print-doc (meta #'first))
clojure.repl=> (map #(print-doc (meta %)) [#'first #'+])
Как видите, Clojure 1.3 требует явного получения метаданных.
Если вам нужно выполнить это из другого пространства имен, вам придется экспортироватьфункция.Один из способов сделать это - определить новую функцию:
clojure.repl=> (defn my-print-doc [m] (print-doc m))
user=> (clojure.repl/my-print-doc (meta #'first))