0

我正在尝试在列表中找到最大数量,然后对其进行处理:

(defun maxList (l)
    (if (= (length l) 1)
            (first l)
        (if (> (first l) (maxList (rest l)))
            (first l)
            (maxList (rest l))
        );if
    );if
);defun


(defun try-let (l)
    (let (a (maxList l))
    (print a)
    );let
);defun

但是它打印 null,但 maxList 有效。我究竟做错了什么 ?

4

2 回答 2

4

您缺少一对括号:

(let ((a (maxList l)))

这是因为let需要一个绑定列表,如

(let ((a 1) (b 2) (c 'foo))
  expr)

所以在这种情况下,你必须传递一个包含绑定的单元素列表(a (maxList l))

于 2013-01-09T09:55:35.703 回答
2
(defun maxList (l)
  (if (= (length l) 1)

打电话LENGTH不是个好主意。它遍历整个列表。

      (first l)
    (if (> (first l) (maxList (rest l)))
        (first l)
      (maxList (rest l)))))

上面调用MAXLIST了两次。也许这里 aLET有用?功能怎么样MAX

如果你编译你的函数,Common Lisp 系统会报错。

CL-USER 35 > (defun try-let (l)
               (let (a (maxList l))
                 (print a)))
TRY-LET

CL-USER 36 > (compile 'try-let)
;;;*** Warning in TRY-LET: MAXLIST is bound but not referenced

这说明 Lisp 编译器认为MAXLIST是一个变量。出了点问题。接下来查看LET.

请参阅特殊运算符 LET、LET*

let ({var | (var [init-form])}*) declaration* form* => result*

这表示它是变量列表或(变量initform)列表。所以你可以看到你错过了让它成为一个列表。您刚刚编写了一个绑定。

于 2013-01-09T10:14:39.183 回答