评估错误 - 错误类型参数: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))
代码如下
(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))