Я реалізував власну, комерційну програму в Common Lisp під назвою Tankan, яка працює в Microsoft Windows як власний виконуваний файл.
Це програма для навчання себе запам'ятовувати японських персонажів канджі.
Програма працює як фоновий сервер HTTP. Виконання цього сервера та перехід на його сторінки координується крихітним додатком із значками системи (він же "Лоток"), який я розробив за допомогою Visual C ++.
Програма із крихітним значком лотка запускає, відстежує та зупиняє сервер на основі Lisp та спілкується з ним за допомогою труб Win32, прив'язаних до його стандартного вводу та виводу. Через трубу сервер Lisp повідомляє програмі піктограми лотка точну URL-адресу з правильним номером порту, і ця програма значка лотка може запустити браузер через API Shell для перегляду цієї 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
і це все.