2

假设我有一个过程 foo,它接受三个参数,并返回一个列表,它们都加倍:

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

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

(define (fooInterface myList)
  ...)

(fooInterface (list 1 2 3))

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

4

3 回答 3

11

您要查找的内容称为apply.

于 2010-06-01T19:06:00.693 回答
0

map 怎么样,可以使用不同的过程定义吗?

(define foo2

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

(map foo2 '(1 2 3 4 5))
于 2011-02-20T10:18:03.187 回答
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))
于 2013-06-06T14:44:12.023 回答