Andere haben zu Recht mit Sprachbeispielen mit "Nein" geantwortet. Ich dachte, ich könnte erweitern, indem ich ein Beispiel hinzufüge, wie man einer Sprache Ausnahmen hinzufügt, ohne jemals OOP zu involvieren.
Ich werde dies im Falle der DSKL (Declarative Sequential Kernel Language) von OZ tun , einer Sprache, die für solche akademischen Dinge gut geeignet ist. Die DSKL (oder DKL) zu sehen hier (Zufallssucher), die Aussagen und Werte Teil. Die genaue Definition ist nicht wichtig, außer dass dies eine sehr einfache Sprache ist, in der keine veränderbaren Variablen (sie werden deklariert und später gebunden) und keine OOP eingebaut sind.
OOP kann nicht einmal als sprachliche Abstraktion zu dieser Kernelsprache hinzugefügt werden. Durch Hinzufügen eindeutiger Namen zur Kernelsprache (NewName) und Verwendung des lokalen Gültigkeitsbereichs kann die Kapselung erreicht werden. Oder durch Hinzufügen eines veränderlichen Status zur Kernelsprache (NewCell) und Verwendung des lokalen Gültigkeitsbereichs kann eine ordnungsgemäße OOP mit Kapselung erreicht werden. Mit der angegebenen Kernelsprache allein ist dies jedoch nicht möglich.
Wenn wir dann der Kernelsprache Ausnahmen hinzufügen, haben wir eine Sprache ohne OOP-Unterstützung, aber mit Ausnahmen. Lassen Sie mich zeigen, wie:
Indem wir eine abstrakte Maschine mit einem Stapel und einem Speicher definieren, können wir definieren, was jede Anweisung in unserer Sprache tun soll (die Semantik der Anweisung). Zum Beispiel skip
im Stapel sollte nichts tun, A = 3
im Stapel sollte (/ vereinheitlichen) A an (/ mit) 3 binden.
Wir beginnen mit dem Hinzufügen der Syntax, wie unsere Ausnahmen definiert werden sollen. Dazu fügen wir <statement>
der DKL zwei weitere Klauseln hinzu .
<statement> ::== ... (old stuff)
| try <statement> catch <id> then <statement> end
| raise <id> end
Hier ist der bekannte Versuch / Fang und eine Möglichkeit, Ausnahmen auszulösen / zu werfen.
Wir definieren ihre Semantik, wie sie auf der abstrakten Maschine arbeiten sollen:
Try
Die semantische Aussage lautet: (try <statement1> catch <id> then <statement2> end)
Do:
- Schieben Sie die semantische Anweisung auf den Stapel
(catch <id> then <statement2> end)
- Schieben Sie die semantische Anweisung auf den Stapel
(<statement1>)
Beachten Sie, dass Anweisung 1 oben auf dem Stapel abgelegt und zuerst ausgeführt wird.
Raise
Die semantische Aussage lautet: (raise <id> end)
Do:
- Wenn sich nichts mehr auf dem Stapel befindet, halten Sie an und melden Sie eine nicht erfasste Ausnahme.
- Andernfalls können Sie die erste semantische Anweisung vom Stapel nehmen. Wenn es sich nicht um eine catch-Anweisung handelt, fahren Sie mit Schritt 1 fort.
- Wir haben einen Haken bekommen, auf dem Formular
(catch <id> then <statement> end)
Schieben Sie (<statement>)
auf den Stapel.
Catch
Wenn während der normalen Ausführung eine catch-Anweisung angezeigt wird, bedeutet dies, dass alles, was in der Ausführung enthalten war, ohne Ausnahmen bis zu dieser Stufe ausgeführt wurde. Also werfen wir einfach catch
den Stack ab und machen nichts.
QED, wir haben eine Sprache mit Ausnahmen und keine Möglichkeit von OOP.
Ich habe den Umgebungsteil von der abstrakten Maschine entfernt, um es einfacher zu machen.