如何将Scheme列表分解为要传递给过程的args?

时间:2011-05-15 21:09:55

标签: scheme max list-manipulation r5rs

我想使用带有(max)个数字的预定义list函数(R5RS),其长度各不相同。不幸的是,(max)接受这样的输入:

(max 2 43 5 6)
=> 43

我试图像这样使用它:

(define lst '(3 5 53 4 53 54 32))
(max lst)

这会产生以下错误。

max: expects argument of type <real number>; given (3 5 53 4 53 54 32)

我如何将此列表分解为我需要的各个参数,因为我将它们传递给(max)

3 个答案:

答案 0 :(得分:6)

你可以考虑使用apply(虽然要注意,这可能会对可接受的元素/参数数量施加限制,具体取决于你对Scheme的实现):

(apply max '(3 4 2 1 78 2 1))

一般情况下,如果不知道元素的数量很少,手动操作可能会更安全:

(define max* (list)
    (if (null? list) (negative-infinity)
        (let loop ((list (cdr list)) (best (car list)))
            (if (null? list) best (loop (cdr list) (max best (car list)))))))

答案 1 :(得分:1)

使用apply基本上转换为运行(max 3 4 2 1 78 2 1),但在某些系统上,过程可以传递的参数数量不是无限的。对于max,您可以使用fold:

来利用其可交换性
(fold-left max -inf.0 '(3 4 2 1 78 2 1))

答案 2 :(得分:0)

您可以编写一个程序,将第一项与第二项进行比较,

(define (largestele lst)
        (if (null? (cdr lst))
            (car lst)
            (if (> (car lst) (cadr lst))
                (largestele (cons (car lst) (cddr lst)))
                (largestele (cdr lst)))))