Сам символ не содержит вашу функцию, а имя, которое он называет, делает.
Это говорит: «возьмите содержимое (@
= deref
) переменной (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
.