Списки как аргументы в схеме

Допустим, у меня есть процедура 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 элемента.


person Cam    schedule 01.06.2010    source источник
comment
@KennyTM: Да, это даст тот же окончательный результат для этого примера. Однако функциональность, которую я пытался получить здесь, заключалась в использовании элементов списка в качестве аргументов для процедуры (см. Ответ Эли).   -  person Cam    schedule 01.06.2010


Ответы (3)


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

person Eli Barzilay    schedule 01.06.2010

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

(define foo2

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

(map foo2 '(1 2 3 4 5))
person New Amateur    schedule 20.02.2011

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

(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))
person snario    schedule 06.06.2013