Это потому, что Emacs Lisp имеет отдельные пространства имен для переменных и функций. Функция, которая была определена с помощью defun
, может быть вызвана путем помещения ее имени сначала в список и оценки этого, но если у вас есть функция в качестве значения (возвращается apply-partially
), вам необходимо использовать funcall
или apply
.
Разница между funcall
и apply
что funcall
вызывает функцию с аргументами, в то время как apply
трактует свой последний аргумент в виде списка, который должен быть добавлен в список аргументов. Таким образом, ваш первый пример должен быть написан с apply
, так как +
не работает со списками:
(apply (apply-partially '+ 1) `(1))
Для вашего второго примера, используйте funcall
, так как аргумент функции не обернута в списке:
(let ((addone (apply-partially #'+ 1)))
(funcall addone 2))
Отличный ответ. Спасибо. –