Ответ 1
Сам символ не удерживает вашу функцию, имена Var это делают.
Это говорит: "Возьмите содержимое (@
= deref
) Var (resolve
), названное символом (symbol
), имя которого "squared"
и примените его (как функцию) к аргумент 2
:
(@(resolve (symbol "squared")) 2)
Это говорит: "Возьмите Вар, названный символом и т.д.":
((resolve (symbol "squared")) 2)
Оба будут работать, поскольку Vars, когда его попросят действовать как функция, откладывают на функции, хранящиеся в них. (Если вы попытаетесь использовать Var как функцию, когда она не привязана к какой-либо функции, это приведет к ошибке).
Это говорит: "Возьмите символ с именем "squared"
и примените его как функцию к аргументу 2
" - обратите внимание, что сам символ используется как функция:
((symbol "squared") 2)
Теперь символы могут использоваться как функции (они реализуют интерфейс clojure.lang.IFn
), но способ, которым они действуют при использовании таким образом, заключается в том, что они сами видят себя в своем аргументе, т.е. рассматривают их аргумент как карту и выполняют поиск внутри него:
('foo {'foo 2})
; is equivalent to
(get {'foo 2} 'foo)
Если аргумент, переданный символу, не имеет смысла делать запросы, возвращается nil
.