Списки в качестве аргументов в схеме - PullRequest
2 голосов
/ 01 июня 2010

Допустим, у меня есть процедура 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, fooInterface все равно будет работать, если переданный список содержит 3 элемента.

Ответы [ 3 ]

11 голосов
/ 01 июня 2010

То, что вы ищете, называется apply.

0 голосов
/ 06 июня 2013

Некоторые реализации, чтобы делать то, что вы хотите ...

(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))
0 голосов
/ 20 февраля 2011

Как насчет карты, будет ли это работать с другим определением процедуры?

(define foo2

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

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