我正在尝试编写自己的最大函数(目前列表中有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)))
答案 0 :(得分:2)
使用cadr
代替cdr
。 Cdr
将获取列表的其余部分,这是一个单个元素列表。因此,您必须在该列表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
,因为所有参数都按降序排列。如果您发现car
,cadr
和caddr
含糊不清,您可能需要尝试别名first
,second
,third
。例如
(> (first list) (second list)) ; is first element greater than second element?