我正在尝试查找列表中的最大数字,然后用它做一些事情:
(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工作。我做错了什么?
答案 0 :(得分:4)
你错过了一对括号:
(let ((a (maxList l)))
这是因为let
采用
(let ((a 1) (b 2) (c 'foo))
expr)
所以在这种情况下你必须传递一个包含绑定(a (maxList l))
答案 1 :(得分:2)
(defun maxList (l)
(if (= (length l) 1)
调用LENGTH
并不是一个好主意。它遍历整个列表。
(first l)
(if (> (first l) (maxList (rest l)))
(first l)
(maxList (rest l)))))
以上拨打MAXLIST
两次。也许在这里LET
有用吗?函数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 ({var | (var [init-form])}*) declaration* form* => result*
其中说它是变量列表或(变量initform)列表。所以你可以看到你错过了把它列为一个列表。你刚刚写了一个绑定。