Sie haben bis jetzt einige gute Antworten; Lassen Sie mich Ihnen ein unpraktisches, aber sehr lehrreiches Beispiel dafür geben, wie Sie eine Sprache ohne den Begriff Stapel oder "Kontrollfluss" überhaupt entwerfen können. Hier ist ein Programm, das Fakultäten ermittelt:
function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = f(3)
Wir setzen dieses Programm in eine Zeichenfolge und bewerten das Programm durch Textsubstitution. Wenn wir also auswerten f(3)
, führen wir eine Suche durch und ersetzen sie durch 3 für i, wie folgt:
function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = if 3 == 0 then 1 else 3 * f(3 - 1)
Toll. Jetzt führen wir eine weitere Textsubstitution durch: Wir stellen fest, dass die Bedingung des "if" falsch ist, und ersetzen eine weitere Zeichenfolge, wodurch das Programm erzeugt wird:
function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = 3 * f(3 - 1)
Jetzt ersetzen wir alle Unterausdrücke mit Konstanten durch einen anderen String:
function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = 3 * f(2)
Und Sie sehen, wie das geht; Ich werde nicht weiter darauf eingehen. Wir könnten so lange eine Reihe von Saitensubstitutionen durchführen, bis wir let x = 6
fertig sind.
Wir verwenden den Stack traditionell für lokale Variablen und Fortsetzungsinformationen. Denken Sie daran, ein Stapel sagt Ihnen nicht, woher Sie gekommen sind, sondern wohin Sie mit diesem Rückgabewert als Nächstes gehen.
Im Zeichenfolgensubstitutionsmodell der Programmierung befinden sich keine "lokalen Variablen" auf dem Stapel. Die formalen Parameter werden durch ihre Werte ersetzt, wenn die Funktion auf ihr Argument angewendet wird, anstatt in eine Nachschlagetabelle auf dem Stapel abgelegt zu werden. Und es gibt kein "irgendwohin als nächstes", weil die Programmbewertung einfach einfache Regeln für die String-Ersetzung anwendet, um ein anderes, aber gleichwertiges Programm zu erstellen.
Natürlich ist das Ersetzen von Strings nicht der richtige Weg. Aber Programmiersprachen, die "Gleichheitsdenken" unterstützen (wie Haskell), verwenden logischerweise diese Technik.