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

ray*_*ray 4 scheme max list-manipulation r5rs

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

(max 2 43 5 6)
=> 43
Run Code Online (Sandbox Code Playgroud)

我试图像这样使用它:

(define lst '(3 5 53 4 53 54 32))
(max lst)
Run Code Online (Sandbox Code Playgroud)

这会产生以下错误.

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

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

Dir*_*irk 6

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

(apply max '(3 4 2 1 78 2 1))
Run Code Online (Sandbox Code Playgroud)

通常,如果不知道元素的数量很少,手动执行它可能更安全:

(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)))))))
Run Code Online (Sandbox Code Playgroud)