Mit Let in Scheme
Ich soll ein Programm schreiben, das finden die Wurzeln der quadratischen Gleichung in Schema. Ich verwendet, LASSEN Sie sich für bestimmte Bindungen.
(define roots-with-let
(λ (a b c)
(let ((4ac (* 4 a c))
(2a (* 2 a))
(discriminant (sqrt ( - (* b b) (4ac)))))
(cons ( / ( + (- b) discriminant) 2a)
( / ( - (- b) discriminant) 2a)))))
Definierte ich die diskriminante mit 4ac
da ich nicht wollte (* 4 a c)
. Obwohl ich definiert haben (4ac (* 4 a c))
, es gibt mir diese Fehlermeldung:
erweitern: ungebundene Bezeichner in Modul:
4ac
.
Meine Frage ist, wie lassen bewerten (in welcher Reihenfolge)? Und wenn ich will 4ac
in meinem let
soll ich schreiben, einen inneren let
? Gibt es einen besseren Weg, dies zu tun?
- Dies ist ein Beispiel von SICP Vorlesung/Buch !
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
let*
stattlet
.Den Unterschied zwischen
let
undlet*
ist folgende:let*
bindet Variablen von Links nach rechts. Früher Bindungen verwendet werden können, in neue Bindung weiter nach rechts (oder nach unten).let
auf der anderen Seite gedacht werden kann als syntaktischer Zucker (oder makro) für einfache lambda-Abstraktion:entspricht
4ac ist eine variable mit einem numerischen Wert, so dass (4ac) ist nicht sinnvoll.
LASSEN Sie bindet alle Variablen, aber die Variablen können nicht verwendet werden, in den Berechnungen für die Werte.
Funktioniert nicht:
Verwenden:
Oben führt A und B mit der ersten LASSEN. In der zweiten LASSEN die beiden A und B können nun verwendet werden, um zu berechnen, C.
Oder:
Benötigen Sie eine speziellen
lassen
-Konstrukt (let*
) hier, da die Variablen innerhalb des let-definition verweisen aufeinander.Es ist eher ein problem der Definition von Umfang, als von der Auswertung eines Ausdrucks (Im üblichen
let
-Definitionen, die Reihenfolge der Auswertung spielt keine Rolle, da die Werte möglicherweise nicht verwenden, jede andere)Wenn Sie lassen, die Bindungen sind nicht sichtbar in jede der Körper. Nutzen,* statt-und finden Sie in der RNRS-Dokumentation für details.