【发布时间】:2015-09-30 02:24:45
【问题描述】:
我是 lisp 的新手,在我大学生涯的这个阶段,我对 lambda 表达式的经验很少。这是一个家庭作业练习,问题是:
- 编写一个 LISP 函数 COUNTALLNUMBERS 来计算列表中数字原子的数量,无论它们嵌套多深。例如: (COUNTALLNUMBERS ‘(1 A 2 (3 B 4 (5 6)))) 返回值 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 开始。我认为如果将输入转换为仅包含原子的列表,而不是嵌套,那么处理所有内容将是最容易的。任何有助于理解这一点的帮助将不胜感激
【问题讨论】:
-
请正确格式化您的代码。就像现在呈现的那样,它是不可读的。
-
我可以做些什么来改进格式?我在课堂上看到的最 lisp 是非常短的函数。
-
一个风格指南在 Practical Common Lisp 中(顺便说一句很棒的书):gigamonkeys.com/book/…
-
使用Emacs 缩进。
-
@coredump:
flatten创建一个新列表;数数不一定要。
标签: lambda lisp common-lisp