Доброго времени суток!
Начинаю попытки создать для Яра спецификацию на то, что называется «исключениями». Вводные таковы:
1. Под капотом Common Lisp с его сигнальным протоколом.И библиотеки, написанные на CL. Поэтому придётся как-то уважать возможности CL.
2. Мне нравится та идея, что исключения являются частью сигнатуры функции. В связи с этим хотелось бы идей на тему того, как реанимировать «checked exceptions». Считается, что программы нужно писать слоями. А исключения проходят сквозь слои. Поэтому исключения нужно либо переупаковывать (что мне не кажется хорошей идеей), либо нарушается модульность. Есть ли какие-то ещё идеи на эту тему? В лиспе типы являются first-class сущностями, кроме того есть тип (А или Б или С). Ничто в принципе не мешает в библиотеке завести некий тип «все-мои-исключения», который будет одним из параметров процесса компоновки. В этом случае прикладной код может идентифицировать типы исключений, полученных от библиотеки, при этом не завися от этих типов. Что думаете на тему того, чтобы вот таким образом реализовать checked исключения без перупаковывания?
А также библиотека может представлять некую разновидность конструкции try..catch, оформленную в виде функции высшего порядка. Прикладной код будет применять эту функцию к телу своей функции и в итоге получится опять же, динамическая компоновка кода. Выглядеть это может как-то так:
определить модуль ру.розинмн.либа1/работа-с-файлами
:пакет
пакет
экспорт (
Все-мои-исключения, //тип
Вернуть-все-мои-исключения //реализация try .. catch
)
кнп
кном
/* функция, реализующая try .. catch. Функция вызывает свой
аргумент "что-делать-с-файлами" и перехватывает все исключения
файловой системы. Если они есть, то возвращает их, иначе
возвращает то, что вернула ф-я "что-делать-с-файлами" */
функция Вернуть-все-мои-исключения(
что-делать-с-файлами -- (: функция() -- тип-любой-кортеж :)
) -- (: тип-кортеж(возможно-исключение --
?Все-мои-исключения,
возврат -- тип-любой-кортеж) :)
// Клиент выглядит так:
функция дело()
Вернуть-все-мои-исключения(
лямбда
С-открытым-файлом
чёто
делать
кнС
кнл
)
кнф
3. Есть проблема «исключение в деструкторе». Для лиспа она не так актуальна, но я хочу в языке конструкции, подобные RAII. Проблема «исключение при отпускании ресурса», как мне кажется, является некоей разновидностью проблемы «исключение в деструкторе». Хотелось бы комментариев прежде всего от лисперов: значима ли эта проблема в лиспе? Если да, то как она правильно решается.
4. Хоть я уже неоднократно подходил к расту и го, я всё же не могу осилить, чем сделанное там отличается по сути от исключений в Яве и С++ и какой в этом смысл. Просветите.
5. А лучше всего, если кто-нибудь возьмётся написать спецификацию, мы её вместе поругаем, поправим и доведём до совершенства.