Altri hanno giustamente risposto "No" con esempi di lingue. Ho pensato di poter estendere aggiungendo un esempio su come aggiungere eccezioni a una lingua senza mai coinvolgere OOP.
Lo farò nel caso del DSKL (Declarative Sequential Kernel Language) di OZ , un linguaggio adatto per cose accademiche come questa. Il DSKL (o DKL) può essere visualizzato qui (risultato della ricerca casuale), la parte Dichiarazioni e valori. La definizione esatta non è importante, a parte il fatto che si tratta di un linguaggio molto semplice senza variabili modificabili (vengono dichiarate e successivamente associate) e non è incorporato OOP.
OOP non può nemmeno essere aggiunto come astrazione linguistica a questo linguaggio del kernel. Aggiungendo nomi univoci al linguaggio del kernel (NewName) e usando l'ambito locale, è possibile ottenere l'incapsulamento. Oppure aggiungendo uno stato mutabile al linguaggio del kernel (NewCell) e usando l'ambito locale OOP corretto con incapsulamento può essere raggiunto. Ma non può essere raggiunto solo con il linguaggio kernel specificato.
Se poi aggiungiamo eccezioni al linguaggio del kernel avremo una lingua senza supporto OOP ma avremo eccezioni. Lascia che ti mostri come:
Definendo una macchina astratta con uno stack e una memoria, possiamo definire cosa dovrebbe fare ogni istruzione nella nostra lingua (la semantica dell'istruzione). Ad esempio skip
nella pila non dovrebbe fare nulla, A = 3
nella pila dovrebbe legare (/ unificare) A a (/ con) 3.
Iniziamo aggiungendo la sintassi di come dovrebbero essere definite le nostre eccezioni. Facciamo questo aggiungendo altre due clausole al <statement>
nel DKL.
<statement> ::== ... (old stuff)
| try <statement> catch <id> then <statement> end
| raise <id> end
Ecco il noto tentativo / cattura e un modo per sollevare / lanciare eccezioni.
Definiamo la loro semantica da come dovrebbero funzionare sulla macchina astratta:
Prova
La dichiarazione semantica è: (try <statement1> catch <id> then <statement2> end)
Do:
- Spingere in pila l'istruzione semantica
(catch <id> then <statement2> end)
- Spingere in pila l'istruzione semantica
(<statement1>)
Nota che l'istruzione 1 sarà in cima allo stack e tentata per prima.
Solleva
La dichiarazione semantica è: (raise <id> end)
Do:
- Se non c'è più nulla in pila, fermati e segnala un'eccezione non rilevata.
- Altrimenti, estrarre la prima istruzione semantica dallo stack. Se non è un'istruzione catch, vai al passaggio 1.
- Abbiamo ottenuto un problema, sul modulo
(catch <id> then <statement> end)
Push (<statement>)
sulla pila.
Cattura
Se vediamo una dichiarazione di cattura durante la normale esecuzione, ciò significa che qualsiasi cosa all'interno è stata eseguita senza aumentare le eccezioni fino a questo livello. Quindi facciamo semplicemente pop catch
dello stack e non facciamo nulla.
QED, abbiamo una lingua con eccezioni e nessuna possibilità di OOP.
Ho rimosso la parte dell'ambiente dalla macchina astratta per renderla più semplice.