【问题标题】:Arguments to APPLY in Lisp在 Lisp 中应用的参数
【发布时间】:2019-01-13 11:30:16
【问题描述】:

我遇到了以下问题:当尝试将 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)))

【问题讨论】:

  • 请注意,该语言称为 Common Lisp,简称:CL。还有一个 Common Lisp 的实现,称为 CLISP。

标签: lisp common-lisp apply map-function


【解决方案1】:

您不需要申请。你为什么要使用它?请记住:APPLY 调用一个函数并将提供的列表用作参数列表。

MAPCAR 返回一个列表。

(let ((foo (mapcar #'1+ '(1 2 3 4))))
   (cond ((eql (last foo) ...) ...)
       ...))

还要检查 last 实际返回的内容...

【讨论】:

    【解决方案2】:

    如果你调用一个函数,例如。 (#'(lambda (a b) (+ a b)) 2 3) 要求参数的数量与提供的参数的数量相匹配。使用apply 时,要求相同,所以(apply #'(lambda (one) ...) lst) 要求lst 只是一个元素列表,如'(a),但不能是'()'(a b)。支持可变数量的参数的唯一方法需要使用 &rest 参数,例如。 (apply #'(lambda (&rest lst) ...) '(a b))

    看逻辑我不明白。当您遇到带有最后一个元素作为数字的列表但还在途中搜索列表元素并在找到它们时提前返回时,您想返回t。在每个步骤中不使用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)))
    

    【讨论】:

    • 谢谢!我不得不使用 MAPCAR,作为家庭作业。 &rest 方法有效。
    • @DariusCătinaș 请注意,如果您 apply 使用带有 rest 的 lambda,它与将结果绑定到 let 并在 let 中执行代码的效果相同,例如 Rainer指出。不过,我认为您无法满足 mapcar 的“任何级别”要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2013-08-25
    • 2015-10-16
    • 1970-01-01
    相关资源
    最近更新 更多