2015-09-22 3 views
0

Я пытаюсь использовать применить-частично в местном контексте:Как использовать `apply-частично`?

((apply-partially '+ 1) `(1)) 

Это дает мне следующую ошибку: eval: Invalid function: (apply-partially (quote +) 1)

аналогично:

(let ((addone (apply-partially #'+ 1))) 
    (addone 2)) 

Почему любой из этого примера Безразлично Работа?

ответ

4

Это потому, что 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)) 
+0

Отличный ответ. Спасибо. –

Смежные вопросы