Исполняет ли pound-quote (hash-quote, # ') в Clojure функции разрешения и символа?

Возможно, вы можете помочь мне найти это в документах. Я использую кавычки, чтобы иметь возможность передавать неоцененные имена функций перед выполнением. Например:

(#'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

Я предполагаю, что это макрос читателя.

У меня такой вопрос: (а) Для чего нужна сокращенная фраза (# ')? б) Можете ли вы объяснить, что он делает? (c) Можете ли вы найти его в документах? (d) Действительно ли это сокращение для функций разрешения и символов?

PS - для тех, кто не находится в США - # также известен как «хэш»; или "перекрестный хэш".

PPS - я знаю, что мой пример делает это несколько избыточным. Мне интересно знать, является ли это полностью избыточным или есть конкретные варианты использования.

 Jouni K. Seppänen08 июн. 2012 г., 21:42
Смотрите также:stackoverflow.com/questions/9113387/…

Ответы на вопрос(2)

#' это макрос для чтенияvar, Увидетьhttp://clojure.org/special_forms#var а такжеhttp://clojure.org/vars

(var foo) возвращает переменную, названную символомfoo, который может содержать любое значение, включая функции.

Решение Вопроса

#' макрос чтения, который расширяется до(var foo), То, что вы делаете здесь, - это не передача не оцененных функций, а обход переменных, содержащих функции. Причина, по которой это работает так, как это происходит, заключается в том, что переменные - это функции, которые ищут свое значение и вызывают его:

user=> (defn foo [x] (+ x 10))
#'user/foo
user=> (#'foo 10)
20
user=> ((var foo) 10)
20

Обратите внимание, что когда я определил функцию, была возвращена переменная. Похоже, что вы делали! :)

 08 июн. 2012 г., 21:37
Черт побери. Вы, безусловно, приветствуетесь. :)
 hawkeye08 июн. 2012 г., 15:21
Энтони Граймс! Мне нравится то, что вы делали в сообществе Clojure. Для меня большая честь получить ответ на этот вопрос.

Ваш ответ на вопрос