在 Lisp 中应用的参数
Arguments to APPLY in Lisp
我遇到了以下问题:当尝试将 APPLY 函数与 MAPCAR 调用一起使用时,传递给 APPLY 的 lambda 函数仅包含一个参数,即 MAPCAR 返回的列表,出现以下错误:
*** - EVAL/APPLY: too many arguments given to :LAMBDA
以下代码确定异构列表是否在任何级别的最后一个原子是数字原子。
(DEFUN hasLastNumeric (L)
(COND
((NUMBERP L) T)
((ATOM L) NIL)
((LISTP L)
(APPLY #'(LAMBDA (Lst)
(COND ((EQ (LAST Lst) T) T)
(T NIL)))
(MAPCAR 'hasLastNumeric L)))))
(WRITE (hasLastNumeric '(1 2 5)))
您不需要申请。你为什么要用它?请记住:APPLY 调用函数并使用提供的列表作为参数列表。
MAPCAR returns 列表。
(let ((foo (mapcar #'1+ '(1 2 3 4))))
(cond ((eql (last foo) ...) ...)
...))
还要检查 last
实际上 returns...
如果您调用函数,例如。 (#'(lambda (a b) (+ a b)) 2 3)
要求参数数量与提供的参数数量相符。当使用 apply
时,要求是相同的,因此 (apply #'(lambda (one) ...) lst)
要求 lst
只是一个元素列表,如 '(a)
,但不能是 '()
或 '(a b)
.支持可变数量参数的唯一方法是使用 &rest
参数,例如。 (apply #'(lambda (&rest lst) ...) '(a b))
看逻辑没看懂。当您遇到最后一个元素为数字的列表时,您想要 return t
并且在途中搜索列表元素并且 return 尽早找到它们。在每个步骤中不使用 last
应该是可能的。例如。
(defun has-a-last-numeric (lst)
(labels ((helper (lst)
(loop :for (e . rest) :on lst
:if (and (null rest) (numberp e))
:do (return-from has-a-last-numeric t)
:if (listp e)
:do (helper e))))
(helper lst)))
我遇到了以下问题:当尝试将 APPLY 函数与 MAPCAR 调用一起使用时,传递给 APPLY 的 lambda 函数仅包含一个参数,即 MAPCAR 返回的列表,出现以下错误:
*** - EVAL/APPLY: too many arguments given to :LAMBDA
以下代码确定异构列表是否在任何级别的最后一个原子是数字原子。
(DEFUN hasLastNumeric (L)
(COND
((NUMBERP L) T)
((ATOM L) NIL)
((LISTP L)
(APPLY #'(LAMBDA (Lst)
(COND ((EQ (LAST Lst) T) T)
(T NIL)))
(MAPCAR 'hasLastNumeric L)))))
(WRITE (hasLastNumeric '(1 2 5)))
您不需要申请。你为什么要用它?请记住:APPLY 调用函数并使用提供的列表作为参数列表。
MAPCAR returns 列表。
(let ((foo (mapcar #'1+ '(1 2 3 4))))
(cond ((eql (last foo) ...) ...)
...))
还要检查 last
实际上 returns...
如果您调用函数,例如。 (#'(lambda (a b) (+ a b)) 2 3)
要求参数数量与提供的参数数量相符。当使用 apply
时,要求是相同的,因此 (apply #'(lambda (one) ...) lst)
要求 lst
只是一个元素列表,如 '(a)
,但不能是 '()
或 '(a b)
.支持可变数量参数的唯一方法是使用 &rest
参数,例如。 (apply #'(lambda (&rest lst) ...) '(a b))
看逻辑没看懂。当您遇到最后一个元素为数字的列表时,您想要 return t
并且在途中搜索列表元素并且 return 尽早找到它们。在每个步骤中不使用 last
应该是可能的。例如。
(defun has-a-last-numeric (lst)
(labels ((helper (lst)
(loop :for (e . rest) :on lst
:if (and (null rest) (numberp e))
:do (return-from has-a-last-numeric t)
:if (listp e)
:do (helper e))))
(helper lst)))