2010-10-05 5 views

ответ

17

Вы должны использовать funcall, если у вас есть один или несколько отдельных аргументов и apply, если у Вас есть свои аргументы в списке

(defun passargs (&rest args) (apply #'myfun args)) 

или

(defun passargs (a b) (funcall #'myfun a b)) 
1

Ну, я думаю, хорошее эмпирическое правило будет быть: использовать, если вы не можете использовать funcall: последний более ясный, но также менее общий, чем применяется, поскольку он не позволяет вам вызывать функцию, число аргументов которой известно только во время выполнения.

Конечно, это только хорошая практика, и вы могли бы систематически делать это уродливый путь (систематически используя плату), но, как вы, вероятно, заметил, используя уродливый путь, когда очень похож, но уборщик способ доступен в не очень распространенный-lisp-y.

Пример функции, которая должна применяться вместо FUNCALL: могли бы вы реализуете карту таким образом, что (map #'+ '(1 2) '(2 3)) и (map #'+ '(1 2) '(2 3) '(3 4)) оба работают (как в случае со стандартной функцией) без использования применяются (или Eval, который изменяет) ?

EDIT: а также было отмечено, что было бы глупо писать: (funcall func (first list) (second list) (third list) etc.) вместо (apply func list).

5

apply полезен, когда список аргументов известен только во время выполнения, особенно когда аргументы динамически считываются в виде списка. Вы все равно можете использовать funcall, но вам нужно распаковать отдельные аргументы из списка, что неудобно. Вы также можете использовать apply, например funcall, перейдя по отдельным аргументам. Единственное, что он требует, это то, что последним аргументом должен быть список:

> (funcall #'+ 1 2) 
3 
> (apply #'+ 1 2()) 
3 
Смежные вопросы