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

Используя функцию символа clojure для вызова косвенной функции

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

user=> (defn squared [x] (* x x))
#'user/squared
user=> (squared 2)
4
user=> ((symbol "squared") 2)
nil
user=> ((symbol "user" "squared") 2)
nil
user=> 
4b9b3361

Ответ 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.