在 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)))