需要帮助理解LISP吗

需要帮助理解LISP吗,lisp,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

我正在尝试编写自己的最大函数(目前列表中有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)))

使用
cadr
而不是
cdr
Cdr
获取列表的其余部分,这是一个单一元素列表。因此,您必须在该列表中调用
car
(car(cdr列表))。因为这是一件很常见的事情,所以他们制作了
cadr
一个计算结果与此相符的函数

使用
cadr
而不是
cdr
Cdr
获取列表的其余部分,这是一个单一元素列表。因此,您必须在该列表中调用
car
(car(cdr列表))。因为这是一件很常见的事情,所以他们制作了
cadr
一个计算结果与此相符的函数

您的代码中有几个错误。我将给您一些如何改进的建议

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

如果是死代码,则第一个

只要第一个
if
的结果没有将您放入调试器,第二个
if
将运行。因此,当第一个
固定时,它将是冗余代码。你真的应该试着既有结果又有选择,即使标准没有要求

(如果测试-1;谓词
测试-1-真表达式;结果
测试-1-假表达);可供替代的
第二个
if
当然应该是这些表达式中的一个,而不是无条件地发生在第一个表达式中的某个表达式

在更新的代码中
至少需要两个参数才有用。
您可以将
>
看作是一个测试所有参数是否按降序排列的函数
(>4)
T
,因为所有参数都是按降序排列的。如果您发现
car
cadr
caddr
很神秘,您可能需要尝试别名
第一个
第二个
第三个
。乙二醇

(>(第一个列表)(第二个列表));第一个元素大于第二个元素吗?

您的代码中有几个错误。我将给您一些如何改进的建议

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

如果
是死代码,则第一个

只要第一个
if
的结果没有将您放入调试器,第二个
if
将运行。因此,当第一个
固定时,它将是冗余代码。你真的应该试着既有结果又有选择,即使标准没有要求

(如果测试-1;谓词
测试-1-真表达式;结果
测试-1-假表达);可供替代的
第二个
if
当然应该是这些表达式中的一个,而不是无条件地发生在第一个表达式中的某个表达式

在更新的代码中
至少需要两个参数才有用。
您可以将
>
看作是一个测试所有参数是否按降序排列的函数
(>4)
T
,因为所有参数都是按降序排列的。如果您发现
car
cadr
caddr
很神秘,您可能需要尝试别名
第一个
第二个
第三个
。乙二醇

(>(第一个列表)(第二个列表));第一个元素大于第二个元素吗?

谢谢您的解释。或者,如果您想要的实际上是列表中的第一个和第二个元素,请使用
first
second
:在程序中说出您的意思总是很好的。(是的,我知道第一个
汽车
&c:这不是我要说的重点。)@tfb个人来说,“第二个”在不同的上下文中可能意味着很多不同的东西
cadr
清晰明确,有自己的背景。与第九节与第十节相同。是的,我知道第一个
到第十个
被定义为处理列表,但仅从它们的名称来看还不清楚。YMMV.@Willenss在列表处理的上下文中,它与Lisp家族语言有着如此重要的历史关联,
first
rest
&c说你在谈论列表,而
car
cdr
&c说你在谈论conses。@tfb这就是为什么我写了“second”,而不是
second
。是的,我知道
second
处理列表(或者“conses”-
rest
在各个方面都相当于
cdr
,如果我没有弄错的话),但是“second”这个名字对我没有帮助。“cadr”这个名字确实有,而且历史上Lisps一直使用的是
cadr
。但是,谢谢你的解释。或者,如果你想要的实际上是列表中的第一个和第二个元素,请使用
first
second
:在程序中说出你的意思总是好的。(是的,我知道第一个是
汽车
&c:这不是我要说的重点。)@tfb个人来说,“第二个”在不同的上下文中可能意味着很多不同的东西;