2015-01-31 3 views

ответ

4

apply принимает список в качестве последнего аргумента, так что эти вызовы являются правильными:

(apply func "a" '("b")) 
(apply func '("a" "b")) 

Чтобы передать простые аргументы, вы можете использовать funcall вместо:

(funcall func "a" "b") 

В конце концов, вы можете также использовать apply следующего

(apply func "a" "b" nil) 

или

(apply func "a" "b"()) 

Это потому, что nil и () считаются пустыми списками в Emacs Lisp.

1

apply принимает функцию и список, так что используйте

(apply func '("a" "b")) 

Или просто

(func "a" "b") 
2

Типичным применением apply является применение одной функции к списку аргументов, а затем «распространение» этого списка по аргументам. С другой стороны, funcall необходим только потому, что elisp разделяет функцию и переменные привязки.

(defun wrapped-fun (fun a b) 
    "Wrapped-fun takes a function and two arguments. It first does something, 
    then calls fun with the two arguments, then finishes off doing 
    something else." 
    (do-something) 
    (funcall fun a b) ;; Had function and variable namespaces been the same 
         ;; this could've been just (fun a b) 
    (do-something-else)) 
Смежные вопросы