Zaimplementowałem zastrzeżoną, komercyjną aplikację w Common Lisp o nazwie Tankan, która działa w systemie Microsoft Windows jako natywny plik wykonywalny.
Jest to program służący do zapamiętywania japońskich znaków kanji.
Program działa jako serwer HTTP w tle. Wykonywanie tego serwera i przechodzenie do jego stron jest koordynowane przez niewielką aplikację w obszarze powiadomień systemowych (znaną również jako „Tray”), którą opracowałem przy użyciu Visual C ++.
Uruchamia się aplikacja ikony małej tacy, monitoruje i zatrzymuje serwer oparty na Lisp i komunikuje się z nim za pomocą potoków Win32 powiązanych ze standardowym wejściem i wyjściem. Za pomocą potoku serwer Lisp informuje aplikację ikony zasobnika o dokładnym adresie URL z odpowiednim numerem portu, a ta aplikacja ikony zasobnika może uruchomić przeglądarkę za pośrednictwem interfejsu API powłoki, aby przeglądać ten adres URL. Użytkownik wystarczy dwukrotnie kliknąć ikonę, aby wyświetlić interfejs użytkownika.
Program Lisp utrzymuje w pamięci dość złożony stan sesji, który zawiera historię danych wejściowych użytkownika i różne relacje między różnymi obiektami. Okrągła notacja obiektowa Lispa (włączana przez *print-circle*
zmienną) i sposób jej działania w niestandardowych print-object
metodach CLOS stanowi ogromną pomoc w implementacji trwałości: użytkownicy mogą zapisać stan na dysk i wznowić od miejsca, w którym przerwali. Wszystko jest zapisywane, w tym stan interfejsu użytkownika. Na wykresie obiektowym jest wiele współużytkowanych podkonstrukcji, a także cykli. Plus, wiele statycznych cruft, które nie muszą być utrwalane, jak zawartość obiektów wejściowych słownika. Za pomocą niestandardowych metod drukowania obiektów ANSI Common Lisp można tworzyć skondensowane reprezentacje drukowane dla obiektów, które mimo to można odczytać maszynowo,
Prawie nie JavaScript jest używany w interfejsie internetowym. Nawet kontrole ukrywania i pokazywania części interfejsu użytkownika są wykonywane przez przesłanie formularza i ponowne renderowanie HTML. Każdy szczegół stanu interfejsu użytkownika znajduje się zatem na serwerze i jest zapisywany, gdy użytkownik zapisuje dane. Ponowna generacja kodu HTML jest bardzo szybka. Robi to gigantyczne wyrażenie zwrotne Lisp, które zasila makro generujące HTML. Kod skompilowany przez Clozure Common Lisp (CCL) sprawia, że dzieje się to tak szybko, że prawie nie zdajesz sobie sprawy, że kiedy klikniesz przycisk [+] w interfejsie użytkownika, aby coś otworzyć, przesyłasz żądanie do serwera, który regeneruje cała cholerna strona, a nie po prostu uruchomienie lokalnego JavaScript w celu zmiany widoczności lokalnego elementu dokumentu.
Program został pierwotnie opracowany z CLISP. Dzięki temu, że ANSI CL jest językiem standardowym, a implementacje są dobrze zgodne i nie ma zbyt wielu podstępnych pułapek w języku (zachowanie „niezdefiniowane” lub „zdefiniowane w ramach implementacji”) dość łatwo można je przenieść do CCL.
CLISP nie został porzucony; jest nadal używany do zasilania zaplecza licencyjnego, wykorzystując większość tej samej wspólnej bazy kodu.
Opracowałem oryginalny system licencjonowania programu, używając kryptografii krzywej eliptycznej dostarczonej przez bibliotekę IronClad, która jest używana przez serwer licencyjny do podpisywania licencji w celu ich certyfikacji. (Wydaje mi się, że pamiętam, że mogłem użyć programu wiersza poleceń OpenSSL do wygenerowania parametrów EC klucza serwera).
Licencje są reprezentowane jako obiekty Lisp. W hołdzie przenośności Lisp program Windows skompilowany przez Clozure Common Lisp może wygenerować licencję opartą na wyrażeniu S, program CLISP działający na serwerze Debian może wypełnić brakujące pole podpisu cyfrowego w tym obiekcie i odesłać go z powrotem do program Windows, który może sprawdzić poprawność podpisu.
Na serwerze, oprócz usługi licencjonowania opartej na CGI, mam prosty interfejs API wiersza poleceń do zarządzania licencjami. Możesz wyświetlić listę licencji, znaleźć określone i edytować ich atrybuty: na przykład edytować datę wygaśnięcia licencji tymczasowej, aby udzielić użytkownikowi wyjątku. Back-end licencjonowania generuje również e-maile. Nie korzystałem z żadnej biblioteki do obsługi CGI po stronie serwera: po prostu ręcznie zwinięty kod Lisp do obsługi zmiennych środowiskowych Apache i argumentów wiersza poleceń. (Chociaż kod biblioteki jest używany do kodowania adresów URL i generowania HTML.) Żadna baza danych nie jest używana do przechowywania; licencje są catenated do pliku o nazwie licenses.lisp
i to wszystko.