lambda - lisp 新手,编译器告诉我这是一个糟糕的 lambda

标签 lambda lisp common-lisp

我是 lisp 的新手,在我大学生涯的这个阶段,对 lambda 表达式的经验很少。这是一个家庭作业练习,问题如下:

  1. Write a LISP function COUNTALLNUMBERS which counts the number of numeric atoms in a list, no matter how deeply nested they are. For example: (COUNTALLNUMBERS ‘(1 A 2 (3 B 4 (5 6)))) Returns the value 6

我也在使用 Lispworks 编译我的代码,但一直收到错误:

 Badly formed lambda: (NUMBERP (CAR LIST) (+ 1 (COUNTALLNUMBERS (CDR LIST))))

这是我的代码:

(defun countallnumbers(list)
  (if (eql list nil)
      nil 
    (let ((elem (car list))
          (restlist (cdr list)))
      (if (listp elem)
          (append (countallnumbers elem) (countallnumbers restlist))
        (append (cons elem nil) (countallnumbers restlist)))
      ((numberp (car list) (+ 1 (countallnumbers (cdr list))))))))

(write (countallnumbers '(1 2 3 a b (4 c))))

到目前为止,我已经测试并让一切正常工作,直到以调用 numberp 开头的那一行。我认为如果将输入转换为只有原子的列表,没有嵌套,那么处理所有事情会最容易。任何有助于理解这一点的帮助将不胜感激

最佳答案

语法错误在:

((numberp (car list) (+ 1 (countallnumbers(cdr list)))))

因为,给定您的程序,此列表被读取为一种形式,其第一个元素应该是符号函数或 lambda 列表(即 (lambda (args) body))和保留此函数的参数。另一方面,如果您已将此写为要评估的条件(给定谓词 numberp),则它写在 if 形式之外,该形式只有一个条件(不同于 cond)。

你的函数有一个主要问题:它应该返回一个数字,但是当输入是一个空列表时你返回列表(结果应该是 0,而不是 nil),以及在其他情况下通过 append

还有其他一些小的风格问题:

  1. 测试空列表的常用方法是使用(endp list),而不是(eql list nil)
  2. 封闭的括号不应单独写在一行上。

这里是一个可能的函数定义:

(defun countallnumbers(list)
  (cond ((endp list) 0)
        ((numberp (car list)) (1+ (countallnumbers (cdr list))))
        ((listp (car list)) (+ (countallnumbers (car list)) (countallnumbers (cdr list))))
        (t (countallnumbers (cdr list)))))

请注意,使用 cond 而不是 if 因为必须检查四种情况:当列表为空时,当汽车是数字时,或者它是列表时,或者它既不是数字也不是列表。在所有情况下,对于终止情况、列表为 null 和递归情况,都会返回一个整数。 1+是参数加1的函数,注意在car是列表的情况下,结果是加上汽车的数量与列表的 cdr 的数量。

关于lambda - lisp 新手,编译器告诉我这是一个糟糕的 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32856757/

相关文章:

arrays - Lisp 为什么我的对象是同一个实例?

lisp - 禁用 lispworks capi :push-button-panel 上的单个按钮

java - 获取函数引用的注释

python-3.x - lambda 函数中的元组解包

lisp - Mysterious Racket 错误 : define: unbound identifier; also, 没有#%app 语法转换器绑定(bind)在:define

windows - 为什么我无法安装 quicklisp? ("Package QUICKLISP-QUICKSTART does not exist")

sql - 我如何传递这个论点?

lambda - 不能将函数调用用作 s-exp 中的第一个参数

C++14 Lambda - 通过引用或值有条件地捕获

C# 等待 lambda 回调完成