История изменений
Исправление den73, (текущая версия) :
ИСТОРИЯ 1
Часть 1: Поддержка эволюции БД
- migrations
- описание структуры таблиц в виде DSL на s-выражениях (ключевое слово deftable), где также указаны констрейнты, заголовки полей для вывода в формах и прочие мелочи. Внутри использован AP5 - реляционное расширение Common Lisp, которое позволяет внутри образа лисп системы устанавливать отношения между объектами и делать запросы на языке, похожем на SQL (и в чём-то даже более выразительном). Хотя сегодня я бы подумал, перед тем, как снова использовать AP5 - он всё же несколько тормозной.
- описание всех вьюх, триггеров и хранимых процедур на DSL, причём основная часть DDL стейтмента сделана не в виде S-выражений, а прямо на языке базы данных.
- система макросов для облегчения написания SQL-запросов, по сути калька с макросов Common Lisp. См. [lisp][sql]немного похвастаюсь , http://lisp.ru/forums.php?m=posts&p=6873 и ещё где-то писал, но не могу найти уже. Она является практическим доказательством того, что синтаксис S-выражений совершенно не обязателен для создания макросистемы, подобной лисповой
- большая кнопка «применить миграции»
- большая кнопка «собрать серверную часть», к-рая берёт кучу файлов *.lisp и по определениях объектов серверной части SQL собирает базу
- при этом ошибки в DDL запросах к базе данных сразу показываются в исходных файлах .lisp, что не свойственно DSL на базе S-выражений. Таким образом получен гигантский профит и сделан вывод, что генерация других языков из S-выражений - это тупиковый путь для практики, а вот специализированные ридеры для встраивания других языков в CL - это как раз правильно.
- при этом все исходные тексты базы - это тексты, соответственно их можно хранить в системе контроля версий и мерджить
- Также с помощью DSL описаны пользовательские формы. Из этого описания генерируется либо форма, либо конфигурация объекта «controller», а форма в этом случае была написана на Delphi (была ещё версия для Qt когда-то, потом отмерла). Т.е. реальная форма состоит из части, генерируемой из лиспа, и классов на «клиентском» ЯП, который выполняет клиентские задачи.
Часть 2: конвертер БД По сути - просто большой скрипт, можно было обычный командный файл написать (*.bat в моём случае, в линуксе это был бы *.sh). Скрипт ночью качал базу. Благодаря тому, что в Common Lisp очень хороший Just In Time Debugger и горячая замена кода, многократно было сэкономлено много ночных часов - вместо перезапуска всего скрипта перезапускался в лучшем случае один запрос. Самое главное - что в дебаггере полноценный REPL, что позволяло провести диагностику в контексте транзакции базы данных.
Часть 3: сервер приложений Интегрировал складскую и торговую части. Ничего особенного, просто реализована трёхзвенка. Показал достаточную надёжность и лёгкость диагностирования. Неоднократно правился на горячую без перезапуска.
Часть 4: транслятор с 1С в Common Lisp Понадобилось ускорить один скрипт на 1С, поэтому был написан транслятор с 1С 7.7 на CL и немаленька часть рантайм-библиотеки. Процесс не был завершён по причинам, лежащим вне техники.
Под категорию production попадают часть 2 и 3.
ИСТОРИЯ 2:
Моя последняя работа. То, что G2 имеет отношение к Common Lisp, в принципе, известно и без меня, а в остальном я подписывал соглашение о неразглашении :) Если что-то уже наболтал - можете нагуглить сами :)
Есть и другие мелочи, но они меркнут на фоне данных двух.
Исходная версия den73, :
ИСТОРИЯ 1
Часть 1: Поддержка эволюции БД
- migrations
- описание структуры таблиц в виде DSL на s-выражениях (ключевое слово deftable), где также указаны констрейнты, заголовки полей для вывода в формах и прочие мелочи
- описание всех вьюх, триггеров и хранимых процедур на DSL, причём основная часть DDL стейтмента сделана не в виде S-выражений, а прямо на языке базы данных.
- система макросов для облегчения написания SQL-запросов, по сути калька с макросов Common Lisp. См. [lisp][sql]немного похвастаюсь , http://lisp.ru/forums.php?m=posts&p=6873 и ещё где-то писал, но не могу найти уже. Она является практическим доказательством того, что синтаксис S-выражений совершенно не обязателен для создания макросистемы, подобной лисповой
- большая кнопка «применить миграции»
- большая кнопка «собрать серверную часть», к-рая берёт кучу файлов *.lisp и по определениях объектов серверной части SQL собирает базу
- при этом ошибки в DDL запросах к базе данных сразу показываются в исходных файлах .lisp, что не свойственно DSL на базе S-выражений. Таким образом получен гигантский профит и сделан вывод, что генерация других языков из S-выражений - это тупиковый путь для практики, а вот специализированные ридеры для встраивания других языков в CL - это как раз правильно.
- при этом все исходные тексты базы - это тексты, соответственно их можно хранить в системе контроля версий и мерджить
- Также с помощью DSL описаны пользовательские формы. Из этого описания генерируется либо форма, либо конфигурация объекта «controller», а форма в этом случае была написана на Delphi (была ещё версия для Qt когда-то, потом отмерла). Т.е. реальная форма состоит из части, генерируемой из лиспа, и классов на «клиентском» ЯП, который выполняет клиентские задачи.
Часть 2: конвертер БД По сути - просто большой скрипт, можно было обычный командный файл написать (*.bat в моём случае, в линуксе это был бы *.sh). Скрипт ночью качал базу. Благодаря тому, что в Common Lisp очень хороший Just In Time Debugger и горячая замена кода, многократно было сэкономлено много ночных часов - вместо перезапуска всего скрипта перезапускался в лучшем случае один запрос. Самое главное - что в дебаггере полноценный REPL, что позволяло провести диагностику в контексте транзакции базы данных.
Часть 3: сервер приложений Интегрировал складскую и торговую части. Ничего особенного, просто реализована трёхзвенка. Показал достаточную надёжность и лёгкость диагностирования. Неоднократно правился на горячую без перезапуска.
Часть 4: транслятор с 1С в Common Lisp Понадобилось ускорить один скрипт на 1С, поэтому был написан транслятор с 1С 7.7 на CL и немаленька часть рантайм-библиотеки. Процесс не был завершён по причинам, лежащим вне техники.
Под категорию production попадают часть 2 и 3.
ИСТОРИЯ 2:
Моя последняя работа. То, что G2 имеет отношение к Common Lisp, в принципе, известно и без меня, а в остальном я подписывал соглашение о неразглашении :) Если что-то уже наболтал - можете нагуглить сами :)
Есть и другие мелочи, но они меркнут на фоне данных двух.