需要帮助来理解LISP

时间:2016-09-17 02:03:19

标签: lisp

我正在尝试编写自己的最大函数(目前列表中有2个元素)但在执行简单函数时出错:

(defun max_for_vararg (list)
    (if (null list)
        (nil))
    (if (> (car list) (cdr list))
        (car list)
        (cdr list)))

错误为:

? (max_for_vararg '(2 4))
> Error: The value (4) is not of the expected type REAL.
> While executing: CCL::>-2, in process listener(1).
> Type :POP to abort, :R for a list of available restarts.

如果有人能帮我理解,我很感激。错误似乎让我感到困惑,因为像下面这样的类似函数运行正常但没有返回最大值。

(defun max_for_vararg (list)
    (if (null list)
        (nil))
    (if (> (car list))
        (car list)
        (cdr list)))

2 个答案:

答案 0 :(得分:2)

使用cadr代替cdrCdr将获取列表的其余部分,这是一个单个元素列表。因此,您必须在该列表car上调用(car (cdr list))。由于这是一个常见的事情,他们使cadr成为一个评估它的函数。

答案 1 :(得分:1)

您的代码中有几处错误。我会就如何改进它给您一些指示。

您尝试调用名为nil的函数。 第一个if的结果是(nil),因此调用nil就好像它是一个已定义的函数。其他位置的nil是空列表,因此除非您创建了一个名为nil的函数,否则这可能是一个错误。

第一个if是死代码 只要第一个if的结果没有让您进入调试器,第二个if就会运行。因此,当第一个if被修复时,它将是冗余代码。你真的应该尝试同时拥有后果和替代品,即使标准不需要它。

(if test-1                      ; predicate
    test-1-true-expression      ; consequent
    test-1-false-expression)    ; alternative

第二个if当然应该是其中一个表达式而不是第一个表达无条件的东西。

在更新的代码>中,至少需要两个参数才有用。 您可以将>视为一个函数,用于测试所有参数是否按降序排列。 (> 4)T,因为所有参数都按降序排列。如果您发现carcadrcaddr含糊不清,您可能需要尝试别名firstsecondthird。例如

(> (first list) (second list))  ; is first element greater than second element?