我正在尝试构建一个lisp函数,该函数将car和cdr通过一个列表,同时将该列表中的值与最大值进行比较如果列表中的值大于最大值,则该值将替换为最大值我想知道为什么我得到的回报值是零我对lisp还不熟悉,而且我来自Java背景,所以它对我来说很不一样我不允许使用任何面向对象的东西,而且我只限于car、cdr、append、cons我想返回“elements2”列表。
(defun enforce-upper-limit(maxVal elements elements2)
(when elements
(cond ((greaterThanMax (car elements) maxVal)(enforce-upper-limit maxVal (cdr lst) (append (maxVal))))
(t (enforce-upper-limit maxVal (cdr elements)(append (car elements)))))
)
)
最佳答案
格式化和命名
普通的Lisp不区分大小写,因此您的maxVal
和greaterThanMax
将变得不可读用-
分隔名称的各个部分,并使所有内容小写。
空格:左括号前面应该有空格。
缩进:这个有各种规则,但是长话短说:Lisp模式下的Emacs在<Tab>
最后,不要太长的行,通常80个字符的规则几乎是通用的。
整理后将如下:
(defun enforce-upper-limit (max-val elements elements2)
(when elements
(cond ((greater-than-max (car elements) max-val)
(enforce-upper-limit max-val (cdr lst) (append (max-val))))
(t (enforce-upper-limit max-val (cdr elements)
(append (car elements))))))
代码中的问题
一些明显的问题:
第4行:expression
(max-val)
将调用一个没有参数的函数max-val
我怀疑这是你想要的。函数
append
追加列表在这两种情况下,它既没有要追加的列表,也没有要追加的列表。函数
enforce-upper-limit
最多将返回nil
。什么是
lst
可能应该是elements
。让我们开始修理。首先,让我们来处理问题3当
elements
是nil
时,答案应该累积在elements2
中而且,整个条件表达式类似于if... elseif ...
模式所以,让我们试着把它安排成一个cond
:(defun enforce-upper-limit (max-val elements elements2)
(cond ((null elements) elements2)
((greater-than-max (car elements) max-val)
(enforce-upper-limit max-val (cdr lst) (append (max-val))))
(t (enforce-upper-limit max-val (cdr elements)
(append (car elements)))))
接下来,让我们看看我们真正想要实现什么第二条规定,如果
(car elements)
太大,max-val
应该转到elements2
如果(car elements)
可以(最后一个子句),则将其添加到elements2
中。向列表中添加一项是
cons
的工作,而不是append
在这两种情况下,我们都考虑elements2
,所以表达式应该看起来像(cons something elements2)
此外,用lst
替换elements
会产生(几乎)正确的程序: (defun enforce-upper-limit (max-val elements elements2)
(cond ((null elements) elements2)
((greater-than-max (car elements) max-val)
(enforce-upper-limit max-val
(cdr elements)
(cons max-val elements2)))
(t (enforce-upper-limit max-val (cdr elements)
(cons (car elements) elements2)))))
进一步的问题
不确定
greater-than-max
中是否有需要,简单的>
就足够了。与
elements2
中的项相比,elements
中的项的顺序是错误的(我让您自己来解决这个问题)这是列表迭代算法的一个常见问题。最后,更重要的是
(defun enforce-upper-limit (list max-val)
(loop for x in list
if x > max-val
collect max-val
else
collect x))
但这可能不适合你的任务。