In Schema können Sie Funktionen definieren, die einen Lambda-Ausdruck zurückgeben und sie verwenden, um neue Funktionen zu definieren. Zum Beispiel können Sie diesen CodeFunktion, die auf Lambda auswertet, kann nicht verwendet werden, um neue Funktion innerhalb des Bereichs zu definieren
(define (pow-iter base exp r)
(if (= exp 1)
r
(pow-iter base (- exp 1) (* base r))))
(define (pow exp)
(lambda (base)
(pow-iter base exp base)))
(define cubic (pow 3))
(cubic 2)
Wir haben hier schreiben eine Funktion pow
, die die Exponenten als Argument nimmt und zu einer Lambda-Funktion, die auf die n-te Potenz der gegebenen Basis auswertet.
Wenn wir jedoch setzen, dass in einem Rahmen wie folgt aus:
(define (do-cubic x)
(define (pow-iter base exp r)
(if (= exp 1)
r
(pow-iter base (- exp 1) (* base r))))
(define (pow exp)
(lambda (base)
(pow-iter base exp base)))
(define cubic (pow 3))
(cubic x))
(do-cubic 2)
Ich erhalte eine Fehler
pow: undefined; cannot use before initialization
Warum dieser Fehler auftreten und ist es eine Möglichkeit, es zu beheben, ohne die sich zu wandelnde Logik des Programms?
in Racket siehe i t funktioniert. – Renzo
@Renzo Du meinst, dass es in '#! Racket' funktioniert. In '#! R5rs', selbst unter RacketVM, sollte es fehlschlagen. Sie sind verschiedene Sprachen. – Sylwester