评估错误 - 错误类型参数:listp

Eval error - Wrong type argument: listp

代码如下

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

抛出以下错误

***Eval error*** Wrong type argument: listp, "b"

为什么 apply 将第三个位置的所有参数作为 'func' 的参数?

apply接受一个函数和一个列表,所以使用

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

或者只是

(func "a" "b")

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 中被认为是空列表。

apply 的典型用法是将一个函数应用于参数列表,然后 "spread" 将列表应用于参数。另一方面,只需要 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))