常见的LISP代码说明

时间:2017-06-06 16:07:11

标签: lisp common-lisp

有人可以向我解释这段代码的作用及其工作原理吗?

(defun f (&optional (x nil) (y (if (atom x) nil (car x))))
 (cond ((atom x) y)
       ((< (car x) y) (f (cdr x) y))
       (t (f (cdr x) (car x)))))

1 个答案:

答案 0 :(得分:0)

快速浏览代码显示它是一个函数,它返回给定两个数字或数字列表的最大数字。如果给定一个原子,它将返回nil,如果列表中的一个元素不是数字,则返回错误。 以下是我得到的一些结果: CL-USER> (f '(1 2 3 4)) 4 CL-USER> (f '(1 5 2 4)) 5 CL-USER> (f '(1 5 2 4 7)) 7 CL-USER> (f 'y) NIL CL-USER> (f 3 'y) Y 如果列表中存在非数字,则会出现类型错误: CL-USER> (f '(1 x 2 4 7)) 出现以下错误 价值     X 不是类型     数 绑定SB-KERNEL :: X时     [TYPE-ERROR类型的条件]

至于它是如何工作的?该函数比较列表中的数字,第一个参数和数字,第二个参数,并返回它们中最大的一个。它通过递归比较列表的前两个数字来执行此操作,返回与列表其余部分相比较大的数字。