Здесь применимы следующие термины: " Lisp-1 " и " Lisp-2 ".
Ваша попытка вызова будет работать в Лисп-1, например, например. Схема или Clojure.
Common Lisp - это Lisp-2, который примерно означает, что имена переменных и имена функций разделены.
Таким образом, для вызова функции, связанной с переменной, вам нужно либо использовать специальные формы funcall
или apply
, как указали другие, либо установить значение функции символа foo
вместо переменной значение.
Первый в основном принимает значение переменной символа, предполагает / проверяет, что значение является функцией, а затем вызывает функцию (с любыми аргументами, которые вы передали funcall
/ apply
.
Вы действительно не хотите делать последнее, поскольку это довольно глупо во всех случаях, кроме очень специализированных, но для полноты картины это примерно так:
CL-USER> (setf (symbol-function 'foo) (lambda () 42))
#<FUNCTION (LAMBDA ()) {C43DCFD}>
CL-USER> (foo)
42
Вам также следует изучить специальные формы labels
и flet
(которые обычно используются) - там вы на самом деле do используете последние методы (эти формы создают временную привязку функции для символы).
Итак, ваша проблема будет выглядеть так:
(flet ((foo ()
42))
(foo))
т.е. здесь вы временно привязываете значение function символа foo
к функции, возвращающей 42. В этом временном контексте вы можете затем вызывать (foo)
как обычные глобальные функции.