Другие справедливо ответили «Нет» примерами языков. Я подумал, что могу расширить, добавив пример того, как добавлять исключения к языку, не вовлекая ООП.
Я сделаю это в случае с DSKL (декларативным последовательным языком ядра) OZ , языка, хорошо подходящего для подобных вещей. DSKL (или DKL) можно увидеть здесь (результат случайного поиска), заявления и Values часть. Точное определение не имеет значения, за исключением того, что это очень простой язык без изменяемых переменных (они объявляются и привязываются позже), а также не встроен ООП.
ООП нельзя даже добавить в качестве лингвистической абстракции к этому языку ядра. Добавляя уникальные имена к языку ядра (NewName) и используя локальную область видимости, можно добиться инкапсуляции. Или добавляя изменяемое состояние к языку ядра (NewCell) и используя локальную область видимости, можно достичь правильного ООП с инкапсуляцией. Но это не может быть достигнуто только с указанным языком ядра.
Если затем мы добавим исключения к языку ядра, у нас будет язык без поддержки ООП, но есть исключения. Позвольте мне показать, как:
Определив абстрактную машину со стеком и хранилищем, мы можем определить, что должен делать каждый оператор в нашем языке ( семантика оператора). Например, skip
в стеке ничего не нужно делать, A = 3
в стеке следует связать (/ unify) A с (/ with) 3.
Мы начнем с добавления синтаксиса того, как должны быть определены наши исключения. Мы делаем это, добавляя еще два предложения <statement>
в DKL.
<statement> ::== ... (old stuff)
| try <statement> catch <id> then <statement> end
| raise <id> end
Вот известный try / catch и способ поднять / выбросить исключения.
Мы определяем их семантику по тому, как они должны работать на абстрактной машине:
Попробуйте
Семантическое утверждение: (try <statement1> catch <id> then <statement2> end)
Do:
- Вставьте в стек семантическое утверждение
(catch <id> then <statement2> end)
- Вставьте в стек семантическое утверждение
(<statement1>)
Обратите внимание, что оператор 1 будет на вершине стека, и попытается выполнить сначала.
Поднять
Семантическое утверждение: (raise <id> end)
Do:
- Если в стеке больше ничего нет, остановитесь и сообщите о необработанном исключении.
- Иначе, вытолкните первое семантическое утверждение из стека. Если это не оператор catch, перейдите к шагу 1.
- Мы получили подвох в форме
(catch <id> then <statement> end)
Push (<statement>)
на стек.
Catch
Если мы видим выражение catch во время обычного выполнения, это означает, что все, что было внутри, было выполнено без возведения исключений до этого уровня. Таким образом, мы просто выталкиваем catch
стек и ничего не делаем.
КЭД, у нас есть язык с исключениями и нет возможности ООП.
Я удалил часть среды из абстрактной машины, чтобы сделать ее проще.