我正在尝试构建一个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不区分大小写,因此您的maxValgreaterThanMax将变得不可读用-分隔名称的各个部分,并使所有内容小写。
空格:左括号前面应该有空格。
缩进:这个有各种规则,但是长话短说: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当elementsnil时,答案应该累积在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))

但这可能不适合你的任务。

10-08 00:19