Ich habe in Common Lisp eine proprietäre kommerzielle Anwendung namens Tankan implementiert , die unter Microsoft Windows als native ausführbare Datei ausgeführt wird.
Es ist ein Programm, mit dem Sie sich darin üben können, japanische Kanji-Zeichen auswendig zu lernen.
Das Programm wird als HTTP-Hintergrundserver ausgeführt. Die Ausführung dieses Servers und das Navigieren zu seinen Seiten wird von einer winzigen Symbolanwendung für den Systembenachrichtigungsbereich ("Tray") koordiniert, die ich mit Visual C ++ entwickelt habe.
Die winzige Taskleistensymbolanwendung startet, überwacht und stoppt den Lisp-basierten Server und kommuniziert mit ihm über Win32-Pipes, die an die Standardeingabe und -ausgabe gebunden sind. Über eine Pipe informiert der Lisp-Server die Taskleistensymbolanwendung über die genaue URL mit der richtigen Portnummer, und diese Taskleistensymbolanwendung kann den Browser über die Shell-API starten, um diese URL zu durchsuchen. Der Benutzer klickt einfach doppelt auf das Symbol, um die Benutzeroberfläche aufzurufen.
Das Lisp-Programm behält in seinem Speicher einen ziemlich komplexen Sitzungszustand bei, der den Eingabeverlauf des Benutzers und verschiedene Beziehungen zwischen verschiedenen Objekten enthält. Die kreisförmige Objektnotation von Lisp (durch die *print-circle*
Variable aktiviert ) und die Funktionsweise bei benutzerdefinierten CLOS- print-object
Methoden sind eine enorme Hilfe bei der Implementierung der Persistenz: Benutzer können den Status auf der Festplatte speichern und dort fortsetzen, wo sie aufgehört haben. Alles wird gespeichert, einschließlich des Status der Benutzeroberfläche. Sowohl im Objektgraphen als auch in den Zyklen gibt es viele gemeinsame Unterstrukturen. Außerdem viel statische Kruft, die nicht beibehalten werden muss, wie der Inhalt von Wörterbucheintragsobjekten. Mit den benutzerdefinierten Druckobjektmethoden von ANSI Common Lisp können Sie komprimierte gedruckte Darstellungen für Objekte erstellen, die dennoch maschinenlesbar sind.
In der Web-Benutzeroberfläche wird fast kein JavaScript verwendet. Sogar die Steuerelemente zum Ausblenden und Anzeigen von Teilen der Benutzeroberfläche werden durch Übermitteln des Formulars und erneutes Rendern des HTML-Codes vorgenommen. Jedes Detail des UI-Status befindet sich daher auf dem Server und bleibt erhalten, wenn der Benutzer speichert. Die Neuerstellung des HTML ist sehr schnell. Dies geschieht durch einen riesigen Lisp-Backquote-Ausdruck, der ein HTML-generierendes Makro füttert. Der von Clozure Common Lisp (CCL) kompilierte Code macht dies so schnell, dass Sie kaum bemerken, dass Sie beim Klicken auf die Schaltfläche [+] auf der Benutzeroberfläche eine Anforderung an einen Server senden, der die Datei neu generiert gesamte Stopfseite und nicht nur lokales JavaScript, um die Sichtbarkeit eines lokalen Dokumentelements zu ändern.
Das Programm wurde ursprünglich mit CLISP entwickelt. Dank ANSI CL, einer Standardsprache, mit Implementierungen, die gut übereinstimmen und nicht zu viele Tücken in der Sprache aufweisen ("undefiniertes" oder "implementierungsdefiniertes" Verhalten), ist eine Portierung nach CCL recht einfach.
CLISP wurde nicht aufgegeben. Es wird weiterhin für die Stromversorgung des Lizenz-Backends verwendet, wobei ein Großteil der gleichen gemeinsamen Codebasis verwendet wird.
Ich habe ein ursprüngliches Lizenzierungssystem für das Programm entwickelt, das die von der IronClad-Bibliothek bereitgestellte Krypto-Ellipsenkurve verwendet, um Lizenzen zu signieren und zu zertifizieren. (Ich erinnere mich anscheinend, dass ich möglicherweise das Befehlszeilenprogramm von OpenSSL verwendet habe, um die EC-Parameter für den Serverschlüssel zu generieren.)
Lizenzen werden als Lisp-Objekte dargestellt. Es ist eine Hommage an die Portierbarkeit von Lisp, dass ein von Clozure Common Lisp kompiliertes Windows-Programm eine auf S-Ausdrücken basierende Lizenz generieren kann, ein CLISP-Programm, das auf einem Debian-Server ausgeführt wird, das fehlende Feld für die digitale Signatur in diesem Objekt ausfüllen und an senden kann das Windows-Programm, das die Signatur validieren kann.
Neben dem CGI-basierten Lizenzierungsdienst habe ich auf dem Server eine einfache Befehlszeilen-API zum Verwalten von Lizenzen. Sie können Lizenzen auflisten, bestimmte suchen und deren Attribute bearbeiten, beispielsweise das Ablaufdatum einer temporären Lizenz, um einem Benutzer eine Ausnahme zu gewähren. Das Lizenz-Backend generiert auch E-Mails. Ich habe keine Bibliothek für das CGI-Handling auf der Serverseite verwendet: nur handgerollten Lisp-Code für den Umgang mit den Apache-Umgebungsvariablen und Befehlszeilenargumenten. (Obwohl Bibliothekscode für die URL-Codierung und die HTML-Generierung verwendet wird.) Für die Speicherung wird keine Datenbank verwendet. Die Lizenzen werden in eine Datei namens verkettet licenses.lisp
und das war's.