Listet als Argumente im Schema auf
-
22-10-2019 - |
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.
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))