Common Lisp'te Microsoft Windows'da yerel olarak çalıştırılabilir olarak çalışan Tankan adlı tescilli ve ticari bir uygulama yaptım .
Japonca kanji karakterlerini ezberlemek için kendinizi eğitmek için bir program.
Program arka plan HTTP sunucusu olarak çalışır. Bu sunucunun çalıştırılması ve sayfalarına gidilmesi, Visual C ++ kullanarak geliştirdiğim küçük bir sistem bildirim alanı (aka "Tepsi") simge uygulaması tarafından koordine ediliyor.
Minik tepsi simgesi uygulaması, Lisp tabanlı sunucuyu başlatır, izler ve durdurur ve onun standart giriş ve çıkışına bağlı Win32 borularını kullanarak iletişim kurar. Bir boru aracılığıyla Lisp sunucusu, kesin URL'nin tepsi simgesi uygulamasını doğru bağlantı noktası numarasıyla bilgilendirir ve bu tepsi simgesi uygulaması, bu URL'ye göz atmak için tarayıcıyı Shell API üzerinden başlatabilir. Kullanıcı, kullanıcı arayüzünü getirmek için simgeye çift tıklar.
Lisp programı hafızasında, kullanıcının girdi geçmişini ve çeşitli nesneler arasındaki çeşitli ilişkileri içeren oldukça karmaşık bir oturum durumu sürdürmektedir. Lisp'in dairesel nesne gösterimi ( *print-circle*
değişken tarafından etkin ) ve özel CLOS print-object
yöntemlerinde nasıl çalıştığı , kalıcılığı uygulamada çok büyük bir yardımcıdır: kullanıcılar, durumu diske kaydedebilir ve kaldıkları yerden devam ettirebilirler. UI'nin durumu dahil her şey kaydedilir. Nesne grafiğinde döngülerin yanı sıra çok sayıda paylaşılan altyapı vardır. Ayrıca, sözlük giriş nesnelerinin içeriği gibi, sürdürülmesi gerekmeyen birçok statik güvenlik sorunu da var. ANSI Common Lisp özel baskı nesnesi yöntemleriyle, yine de makinede okunabilen nesneler için yoğun basılı gösterimler oluşturabilirsiniz,
Web kullanıcı arayüzünde neredeyse hiç JavaScript kullanılmamaktadır. Kullanıcı Arabiriminin bölümlerini gizleme ve gösterme kontrolleri bile form gönderme ve HTML'yi yeniden oluşturma yoluyla yapılır. UI durumunun her detayı bu nedenle sunucudadır ve kullanıcı kaydettiğinde devam eder. HTML’nin yeniden oluşturulması çok hızlı. HTML üreten bir makroyu besleyen dev bir Lisp backquote ifadesiyle yapılır. Clozure Common Lisp (CCL) tarafından derlenen kod, bunu o kadar hızlı yapıyor ki, bir şeyi açmak için UI'deki [+] düğmesine tıkladığınızda, yeni bir sunucuya bir istek gönderdiğinizi bilmiyorsunuz. lanet sayfanın tamamı ve yalnızca yerel bir belge öğesinin görünürlüğünü değiştirmek için bazı yerel JavaScript çalıştırma.
Program başlangıçta CLISP ile geliştirildi. ANSI CL'nin standart bir dil olması sayesinde, dilde sinsi tuzaklara ("tanımsız" veya "uygulama tanımlı" davranışa) uygun olmayan uygulamalar ile CCL'ye kolayca taşınabilir.
CLISP terk edilmedi; Yine aynı ortak kod tabanını kullanarak, lisanslama arka ucuna güç vermek için kullanılır.
Program için orijinal bir lisanslama sistemi geliştirdim, lisans sunucusu tarafından onları onaylamak için lisanslama yapmak için kullanılan IronClad kütüphanesinin sağladığı eliptik eğri kriptosunu kullandım. (Sunucu anahtarı için EC parametreleri oluşturmak üzere OpenSSL'nin komut satırı programını kullandığımı hatırlıyor gibiyim.)
Lisanslar Lisp nesneleri olarak temsil edilir. Clozure Common Lisp tarafından derlenen bir Windows programının S ifadesine dayalı bir lisans üretebileceği, Debian sunucusunda çalışan bir CLISP programının bu nesnedeki eksik dijital imza alanını doldurabileceği ve geri gönderebileceği, Lisp taşınabilirliğine bir hediyedir İmzayı doğrulayabilen Windows programı.
Sunucuda, CGI tabanlı lisans hizmetine ek olarak, lisansları yönetmek için basit komut satırı API'ları da kullanıyorum. Lisansları listeleyebilir, belirlilerini bulabilir ve özniteliklerini düzenleyebilirsiniz: örneğin, bir kullanıcıya istisna vermek için geçici bir lisansın son kullanma tarihini düzenleme gibi. Lisanslama back-end ayrıca e-postalar üretir. Sunucu tarafında CGI kullanımı için herhangi bir kütüphane kullanmadım: Apache ortam değişkenleri ve komut satırı argümanları ile ilgilenmek için sadece elle yuvarlanmış Lisp kodu. (Her ne kadar kütüphane kodu URL kodlama ve HTML oluşturma ile uğraşmak için kullanılsa da.) Depolama için hiçbir veritabanı kullanılmaz; lisanslar adı verilen bir dosyaya dönüştürülür licenses.lisp
ve işte budur.