在Scheme中列出参数

时间:2010-06-01 19:02:46

标签: list scheme racket procedures

假设我有一个带有三个参数的过程foo,并返回一个全部加倍的列表:

(define  (foo a b c)
  (list (* 2 a ) (* 2 b) (* 2 c)))

我希望能够做的是创建另一个接受列表的过程,并使用list元素作为参数调用foo,如下所示:

(define (fooInterface myList)
  ...)

(fooInterface (list 1 2 3))

问题是,我不想写fooInterface,假设foo总是有3个参数。也就是说,如果我向foo添加一个额外的参数,只要传入的列表有3个元素,fooInterface仍然可以工作。

3 个答案:

答案 0 :(得分:11)

您要找的是apply

答案 1 :(得分:0)

map如何使用不同的过程定义?

(define foo2

(lambda (x)
  (* x 2)))

(map foo2 '(1 2 3 4 5))

答案 2 :(得分:0)

一些实现你想做的事情......

(define (foo lst)
  (map (lambda (x) (* 2 x)) lst))

(define (foo lst)
  (apply (lambda args (map (lambda (x) (* x 2)) args)) lst))

(define foo
  (lambda args (map (lambda (x) (* x 2)) args))

只是为了好玩,apply的一个非常酷的用法是转置矩阵。考虑:

(define grid     '((1 2 3) 
                   (4 5 6) 
                   (7 8 9)
))

然后,

(apply map list grid)
=> '((1 4 7)
     (2 5 8)
     (3 6 9))