Ich lese auch SICP, und ich war neugierig nach der Definition der normalen Reihenfolge von den Autoren gegeben. Es schien mir Lazy Evaluation ziemlich ähnlich zu sein, also suchte ich nach mehr Informationen bezüglich beider.
Ich weiß, diese Frage wurde vor langer Zeit gestellt, aber ich schaute auf die FAQ und fand keine Erwähnung der Beantwortung alter Fragen, also dachte ich, ich würde das, was ich hier gefunden habe, so dass andere Leute es verwenden können die Zukunft.
Dies ist, was ich gefunden habe, und ich bin geneigt, mit denen sich einig:
Ich würde argumentieren, (wie andere haben), dass lazy evaluation und NormalOrderEvaluation sind zwei verschiedene Dinge; Der Unterschied ist oben angedeutet. In der faulen Bewertung wird die Bewertung des Arguments zurückgestellt, bis es benötigt wird, an diesem Punkt wird das Argument ausgewertet und sein Ergebnis gespeichert (Memo). Weitere Verwendungen des Arguments in der -Funktion verwenden den berechneten Wert. Die C/C++ Operatoren ||, & &, und? : sind beide Beispiele fauler Bewertung. (Es sei denn einigen Neuling C/C++ Programmierer sind genug bescheuert, um eine Überlastung & & oder ||, in welchem Fall der ladenen Versionen in strikter Reihenfolge ausgewertet werden, weshalb die & & ist und || Betreiber sollten nie in C überlastet werden ++).
Mit anderen Worten, jedes Argument wird höchstens einmal ausgewertet, möglicherweise nicht überhaupt.
NormalOrderEvaluation hingegen wertet den Ausdruck bei jeder Verwendung neu aus. Denken Sie an C-Makros, CallByName in Sprachen, die unterstützen, und die Semantik von Schleifenkontrollstrukturen, etc. Normal-Reihenfolge Auswertung kann viel länger dauern als die Anwendung Auswertung, und kann dazu führen, dass Nebenwirkungen mehr als einmal passieren. (Weswegen, natürlich, Aussagen mit Nebenwirkungen im Allgemeinen sollte nicht als Argument für Makros in C/C++ gegeben werden)
Wenn das Argument unveränderlich ist und keine Nebenwirkungen hat, den einzigen Unterschied zwischen den beide ist Leistung. Tatsächlich kann Lazy-Eval in einer rein funktionalen Sprache als eine Optimierung der Normal-Ordnungs-Auswertung angesehen werden. Mit den vorhandenen Nebeneffekten oder den Ausdrücken , die einen anderen Wert zurückgeben können, wenn neu ausgewertet, haben die zwei unterschiedliches Verhalten; normale Reihenfolge eval insbesondere hat einen schlechten Ruf in prozeduralen Sprachen wegen der Schwierigkeit der Argumentation über solche Programme ohne ReferentialTransparency
sollte auch beachtet werden, dass strenge Ordnung Bewertung (sowie faul Auswertung) kann dadurch erreicht werden, eine Sprache, die normale Bewertung durch explizites Memoing unterstützt. Das Gegenteil ist nicht wahr; es erfordert übergibt Thunks, Funktionen oder Objekte, die aufgerufen werden können/Nachrichten , um die Auswertung zu verzögern/zu wiederholen.
Und
Verzögerte Auswertung kombiniert normale Ordnung Auswertung und den Austausch:
• Niemals etwas bewerten, bis Sie zu (normal Ordnung) haben
• Niemals etwas mehr bewerten als einmal (teilen)
http://c2.com/cgi/wiki?LazyEvaluation
http://cs.anu.edu.au/student/comp3610/lectures/Lazy.pdf
Ja, ich lese * SICP *. Ich folgte dem Wikipedia-Link und fand dies in [Lazy evaluation] (http://en.wikipedia.org/wiki/Lazy_evaluation): "Der Ausdruck wird nie mehr als einmal ausgewertet, die Auswertung der applikativen Reihenfolge." Das bedeutet, dass die anwendbare Ordnung auch als Untertyp der Lazy Evaluation verwendet werden könnte. Ich bin ein bisschen verwirrt. –
@Ryan: Anscheinend verwendet die Seite "Lazy Evaluation" eine andere Definition der Anwendungsreihenfolge als die Seite "Evaluation strategie". Ich denke in diesem Fall ist es am besten, Wikipedia einfach zu ignorieren und mit dem zu gehen, was SICP sagt. – sepp2k
Danke für Ihre Erklärung. –