Подтвердить что ты не робот

Является ли фунтовая кавычка (хеш-кавычка, # ') в 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 - я знаю, что мой пример делает необходимость в этом несколько избыточной. Мне интересно узнать, является ли это полностью избыточным или существуют конкретные варианты использования.

4b9b3361

Ответ 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, который может содержать любое значение, включая функции.