Ich möchte ein Programm schreiben, um die Wurzeln der quadratischen Gleichung in Schema zu finden. Ich habe LET für bestimmte Bindungen verwendet.
%Vor% Ich habe die Diskriminante mit 4ac
definiert, weil ich (* 4 a c)
nicht wollte. Obwohl ich (4ac (* 4 a c))
definiert habe, gibt es mir diesen Fehler:
expand: ungebundener Bezeichner im Modul in:
4ac
.
Meine Frage ist, wie lässt sich bewerten (welche Reihenfolge)? Und wenn ich 4ac
in meinem let
möchte, sollte ich ein anderes inneres let
schreiben? Gibt es einen besseren Weg, dies zu tun?
Verwenden Sie let*
anstelle von let
.
Der Unterschied zwischen let
und let*
ist folgender:
let*
bindet Variablen von links nach rechts. Frühere Bindungen können in neuer Bindung weiter rechts (oder unten) verwendet werden.
let
andererseits kann man sich als syntaktischen Zucker (oder Makro) für einfache Lambda-Abstraktion vorstellen:
entspricht
%Vor%4ac ist eine Variable mit einem numerischen Wert, daher ist (4ac) nicht sinnvoll.
LET bindet alle Variablen, aber die Variablen können nicht in den Berechnungen für die Werte verwendet werden.
Das funktioniert nicht:
%Vor%Verwenden:
%Vor%Oben führt A und B mit dem ersten LET ein. Im zweiten LET können jetzt sowohl A als auch B verwendet werden, um C zu berechnen.
Oder:
%Vor% Sie benötigen ein spezielles let
-construct ( let*
) hier, da sich die Variablen innerhalb der Let-Definition aufeinander beziehen.
Es ist eher ein Problem, einen Bereich zu definieren, als einen Ausdruck auszuwerten (In den üblichen let
-Definitionen spielt die Reihenfolge der Auswertung keine Rolle, da die Werte sich nicht gegenseitig verwenden können)