Является ли фунтовая кавычка (хеш-кавычка, # ') в Clojure запуском функций разрешения и символа?
Возможно, вы можете помочь мне найти это в документах. Я использую pound-quote, чтобы иметь возможность передавать неоцененные имена функций до их выполнения. Например:
(#'cons 1 ())
;(1)
(defn funcrunner [func a b]
(func a b))
(funcrunner cons 'a ())
;(a)
(funcrunner 'cons 'a ())
'()
(funcrunner #'cons 'a ())
;(a)
#'cons
;#'clojure.core/cons
(resolve (symbol 'cons))
;#'clojure.core/cons
Я предполагаю, что это макрос читателя.
Мой вопрос: (a) Что такое сокращение фунта (#)? (б) Можете ли вы объяснить, что он делает? (c) Можете ли вы найти его в документах? (d) Действительно ли это сокращение для функций разрешения и символа?
PS - Для тех, кто не в США - #, также известен как "хэш" или "кросс-хэш".
PPS - я знаю, что мой пример делает необходимость в этом несколько избыточной. Мне интересно узнать, является ли это полностью избыточным или существуют конкретные варианты использования.
Ответы
Ответ 1
#'
- это макрос читателя, который расширяется до (var foo)
. То, что вы здесь делаете, не проходит вокруг неоценимых функций, вы проходите вокруг vars, которые содержат функции. Причина, по которой это работает, заключается в том, что vars - это функции, которые ищут свою содержащуюся ценность и называют ее:
user=> (defn foo [x] (+ x 10))
#'user/foo
user=> (#'foo 10)
20
user=> ((var foo) 10)
20
Обратите внимание, что когда я определил функцию, var был возвращен. Похоже на то, что вы делали!:)
Ответ 2
#'
- это макрос читателя для var
. См. http://clojure.org/special_forms#var и http://clojure.org/vars
(var foo)
возвращает var, обозначенный символом foo
, который может содержать любое значение, включая функции.