Frage

Nehmen wir an, ich habe ein Verfahren, das drei Argumente einnimmt und eine Liste von allen verdoppelt:

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

Was ich gerne tun möchte, ist eine andere Prozedur zu erstellen, die eine Liste akzeptiert und Foo mit den Listenelementen als Argumente wie folgt aufruft:

(define (fooInterface myList)
  ...)

(fooInterface (list 1 2 3))

Der Haken ist, ich möchte nicht fooInterface schreiben, vorausgesetzt, Foo wird immer 3 Argumente haben. Das heißt, wenn ich Foo ein zusätzliches Argument hinzufüge, sollte FooInterface immer noch funktionieren, sofern die in übergebene Liste 3 Elemente enthält.

War es hilfreich?

Lösung

Was Sie suchen, heißt apply.

Andere Tipps

Wie wäre es mit MAP, würde das mit einer anderen Verfahrensdefinition funktionieren?

(define foo2

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

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

Einige Implementierungen, um das zu tun, was Sie wollen ...

(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))

Nur zum Spaß eine wirklich coole Verwendung von apply ist in der Transponierung einer Matrix. In Betracht ziehen:

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

Dann,

(apply map list grid)
=> '((1 4 7)
     (2 5 8)
     (3 6 9))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top