Я реализовал проприетарное коммерческое приложение в Common Lisp под названием Tankan, которое работает в Microsoft Windows как собственный исполняемый файл.
Это программа для тренировки запоминания японских иероглифов.
Программа работает как фоновый HTTP-сервер. Выполнение этого сервера и переход к его страницам координируется крошечным приложением-иконкой в области системных уведомлений («Tray»), которое я разработал с использованием Visual C ++.
Приложение крошечного значка в трее запускается, отслеживает и останавливает сервер на базе Lisp и связывается с ним по каналам Win32, привязанным к его стандартному вводу и выводу. Через канал сервер Lisp сообщает приложению иконки в трее точный URL-адрес с правильным номером порта, и это приложение иконки в трее может запускать браузер через API-интерфейс оболочки для просмотра этого URL-адреса. Пользователь просто дважды щелкает значок, чтобы вызвать пользовательский интерфейс.
Программа Lisp поддерживает в своей памяти довольно сложное состояние сеанса, которое содержит историю ввода пользователя и различные отношения между различными объектами. Круговая нотация объекта Lisp (включаемая *print-circle*
переменной) и то, как она работает в пользовательских print-object
методах CLOS, очень помогает в реализации персистентности: пользователи могут сохранить состояние на диск и продолжить с того места, где они остановились. Все сохраняется, включая состояние пользовательского интерфейса. В графе объектов много общих подструктур, а также циклов. Кроме того, много статических ошибок, которые не нужно сохранять, например, содержимое объектов словарных статей. С помощью пользовательских методов печати объектов ANSI Common Lisp вы можете создавать сжатые печатные представления для объектов, которые, тем не менее, являются машиночитаемыми,
JavaScript почти не используется в веб-интерфейсе. Даже элементы управления для скрытия и отображения частей пользовательского интерфейса выполняются путем отправки формы и повторного рендеринга HTML. Следовательно, каждая деталь состояния пользовательского интерфейса находится на сервере и сохраняется при сохранении пользователем. Повторное создание HTML очень быстро. Это делается с помощью гигантского выражения обратной цитаты Lisp, которое передает HTML-генерирующий макрос. Код, скомпилированный Clozure Common Lisp (CCL), делает это настолько быстрым, что вы даже не подозреваете, что когда вы нажимаете кнопку [+] в пользовательском интерфейсе, чтобы открыть что-то, вы отправляете запрос на сервер, который восстанавливает вся проклятая страница, а не просто запуск некоторого локального JavaScript для изменения видимости локального элемента документа.
Программа изначально была разработана с CLISP. Благодаря тому, что ANSI CL является стандартным языком, с реализациями, которые хорошо соответствуют, и не слишком много хитрых ошибок в языке («неопределенное» или «определяемое реализацией» поведение), он довольно легко переносится на CCL.
CLISP не был оставлен; он по-прежнему используется для поддержки лицензирования, используя большую часть общей базы кода.
Я разработал оригинальную систему лицензирования для программы, используя криптографическую систему с эллиптическими кривыми, предоставляемую библиотекой IronClad, которая используется сервером лицензирования для подписи лицензий для их сертификации. (Кажется, я помню, что мог использовать программу командной строки OpenSSL для генерации параметров EC для ключа сервера.)
Лицензии представлены в виде объектов Lisp. Это дань переносимости Lisp, что программа Windows, скомпилированная Clozure Common Lisp, может генерировать лицензию на основе S-выражений, программа CLISP, запущенная на сервере Debian, может заполнить отсутствующее поле цифровой подписи в этом объекте и отправить его обратно в программа Windows, которая может проверить подпись.
На сервере, помимо службы лицензирования на основе CGI, используется простой API командной строки для управления лицензиями. Вы можете перечислить лицензии, найти конкретные и отредактировать их атрибуты: например, изменить дату истечения срока действия временной лицензии, чтобы предоставить пользователю исключение. Сервер лицензирования также генерирует электронные письма. Я не использовал никакой библиотеки для обработки CGI на стороне сервера: просто свернутый вручную код Lisp для работы с переменными среды Apache и аргументами командной строки. (Хотя код библиотеки используется для работы с кодировкой URL и генерацией HTML.) База данных не используется для хранения; лицензии объединяются в файл с именем licenses.lisp
и все.