lisp - Common Lisp 中 &rest 参数和列表的区别

标签 lisp common-lisp

(defun highest (lat)
    (cond
        ((null lat) nil)
        ((null (cdr lat)) (car lat))
        (T (higher (car lat) (highest (cdr lat))))))

(defun higher (a1 a2)
    (cond
        ((> a1 a2) a1)
        (T a2)))

此函数按预期工作:

> (highest '(3 5 1 2 3))    
3. Trace: (HIGHEST '(3 5 1 2 3))
4. Trace: (HIGHEST '(5 1 2 3))
5. Trace: (HIGHEST '(1 2 3))
6. Trace: (HIGHEST '(2 3))
7. Trace: (HIGHEST '(3))
7. Trace: HIGHEST ==> 3    
6. Trace: HIGHEST ==> 3
5. Trace: HIGHEST ==> 3
4. Trace: HIGHEST ==> 5    
3. Trace: HIGHEST ==> 5

但是如果我将参数更改为&rest:

(defun highest (&rest args)
    (cond
        ((null args) nil)
        ((null (cdr args)) (car args))
        (T (higher (car args) (highest (cdr args))))))

它的行为不一样。

> (highest 3 5 1 2 3)
3. Trace: (HIGHEST '3 '5 '1 '2 '3)
4. Trace: (HIGHEST '(5 1 2 3))
4. Trace: HIGHEST ==> (5 1 2 3)
*** - >: (5 1 2 3) is not a real number

编辑:抱歉,我忘了提到我在第二种情况下将参数传递给原子。我编辑了问题以使其更清楚。

最佳答案

在调用 (highest 3 2 10) 之前尝试评估 (trace highest)。然后你会看到第二个调用看起来像这样: (最高'(2 10)) 然后 &rest 参数看到一个恰好是列表的对象。

要更正此问题,请使用 APPLY。 APPLY 类似于​​ funcall,但它的最后一个参数必须是一个列表,并且被视为“拼接”到函数调用上。像这样: (应用#'最高(cdr args))

关于lisp - Common Lisp 中 &rest 参数和列表的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15775215/

相关文章:

list - 用有限的程序实现列表(lisp)

lisp - 'The Little Lisper' [3rd Edn] 是用哪种 LISP 方言写的? (当时)

list - 在 Common Lisp 中创建升序数字列表

subprocess - SBCL:在运行时收集运行程序进程的输出

emacs - Scheme 中最接近 Slime 的东西是什么?

lambda - 我不明白为什么 lambda 方案有效

string - 字符串处理中Lisp性能优化方案

parsing - (Prolog) 将 Lisp s-表达式解析为 Prolog 术语

common-lisp - 如何删除结构的 defmethod

list - Lisp S 表达式和列表长度/大小