मैंने टैंकन नामक कॉमन लिस्प में एक मालिकाना, वाणिज्यिक एप्लिकेशन को लागू किया, जो माइक्रोसॉफ्ट विंडोज पर एक देशी निष्पादन योग्य के रूप में चलता है।
यह जापानी कांजी पात्रों को याद करने के लिए खुद को प्रशिक्षित करने का कार्यक्रम है।
कार्यक्रम एक पृष्ठभूमि HTTP सर्वर के रूप में चलता है। इस सर्वर का निष्पादन और इसके पृष्ठों पर नेविगेट करना, एक छोटे सिस्टम अधिसूचना क्षेत्र (उर्फ "ट्रे") आइकन अनुप्रयोग द्वारा समन्वित है, जिसे मैंने विज़ुअल सी ++ का उपयोग करके विकसित किया है।
लिटिल ट्रे आइकन एप्लिकेशन शुरू होता है, मॉनिटर करता है और लिस्प-आधारित सर्वर को रोकता है, और इसके मानक इनपुट और आउटपुट से बंधा Win32 पाइप का उपयोग करके इसके साथ संचार करता है। एक पाइप के माध्यम से, लिस्प सर्वर सही पोर्ट नंबर के साथ सटीक URL के ट्रे आइकन एप्लिकेशन को सूचित करता है, और वह ट्रे आइकन एप्लिकेशन उस URL को ब्राउज़ करने के लिए शेल एपीआई के माध्यम से ब्राउज़र लॉन्च कर सकता है। उपयोगकर्ता यूआई को लाने के लिए आइकन पर केवल डबल-क्लिक करता है।
लिस्प कार्यक्रम इसकी स्मृति को काफी जटिल सत्र स्थिति में बनाए रखता है जिसमें उपयोगकर्ता के इनपुट इतिहास और विभिन्न वस्तुओं के बीच विभिन्न संबंध होते हैं। लिस्प की वृत्ताकार वस्तु संकेतन ( *print-circle*
चर द्वारा सक्षम ) और यह कस्टम CLOS print-object
विधियों में कैसे काम करता है दृढ़ता को लागू करने में एक जबरदस्त मदद है: उपयोगकर्ता डिस्क को फिर से शुरू और फिर से शुरू करने के लिए बचा सकते हैं जहां उन्होंने छोड़ा था। यूआई की स्थिति सहित, सब कुछ सहेजा जाता है। ऑब्जेक्ट ग्राफ, साथ ही साथ साइकिल में बहुत से साझा सबस्ट्रक्चर हैं। इसके अलावा, बहुत से स्थिर क्रॉफ्ट जो कि निरंतर नहीं होने चाहिए, जैसे कि डिक्शनरी एंट्री ऑब्जेक्ट्स की सामग्री। ANSI कॉमन लिस्प कस्टम प्रिंट ऑब्जेक्ट विधियों के साथ, आप उन वस्तुओं के लिए संघनित मुद्रित अभ्यावेदन बना सकते हैं, जो मशीन द्वारा पठनीय हैं,
वेब UI में लगभग कोई जावास्क्रिप्ट का उपयोग नहीं किया गया है। यहां तक कि UI के कुछ हिस्सों को छिपाने और दिखाने के लिए नियंत्रण फ़ॉर्म सबमिशन और HTML को फिर से प्रस्तुत करने के द्वारा किया जाता है। UI स्थिति का प्रत्येक विवरण सर्वर में है और उपयोगकर्ता द्वारा सहेजे जाने पर बना रहता है। HTML का री-जनरेशन बहुत तेज है। यह एक विशाल लिस्प backquote अभिव्यक्ति द्वारा किया जाता है जो एक HTML उत्पादक मैक्रो को खिलाता है। क्लोज़र कॉमन लिस्प (CCL) द्वारा संकलित कोड इतनी तेज़ी से घटित होता है कि आप शायद ही जानते हों कि जब आप कुछ खोलने के लिए UI पर [+] बटन पर क्लिक करते हैं, तो आप एक सर्वर के लिए एक अनुरोध सबमिट कर रहे हैं जो पुन: बनाता है। संपूर्ण दस्तावेज़ पृष्ठ, और स्थानीय दस्तावेज़ तत्व की दृश्यता को बदलने के लिए केवल कुछ स्थानीय जावास्क्रिप्ट नहीं चलाना।
कार्यक्रम मूल रूप से सीएलआईएसपी के साथ विकसित किया गया था। एएनएसआई सीएल के लिए धन्यवाद एक मानक भाषा होने के साथ, कार्यान्वयन के साथ जो अच्छी तरह से अनुरूप नहीं है और भाषा में बहुत अधिक डरपोक नहीं हैं ("अपरिभाषित" या "कार्यान्वयन-परिभाषित" व्यवहार) यह काफी आसानी से सीसीएल में पोर्ट किया गया है।
CLISP को नहीं छोड़ा गया है; यह अभी भी लाइसेंसिंग बैक एंड को पावर करने के लिए उपयोग किया जाता है, समान कॉमन कोड बेस का उपयोग करते हुए।
मैंने कार्यक्रम के लिए एक मूल लाइसेंसिंग प्रणाली विकसित की है, जो आयरनक्लाड लाइब्रेरी द्वारा प्रदान की गई अण्डाकार वक्र क्रिप्टो का उपयोग करके लाइसेंसधारी सर्वर द्वारा उन्हें प्रमाणित करने के लिए लाइसेंस पर हस्ताक्षर करने के लिए उपयोग किया जाता है। (मुझे लगता है कि मैं OpenSSL के कमांड लाइन प्रोग्राम का इस्तेमाल सर्वर की के लिए EC पैरामीटर जेनरेट करने के लिए कर सकता हूं।)
लाइसेंस लिस्प ऑब्जेक्ट के रूप में दर्शाए जाते हैं। यह लिस्प पोर्टेबिलिटी के लिए एक श्रद्धांजलि है कि क्लोज़र कॉमन लिस्प द्वारा संकलित एक विंडोज प्रोग्राम एक एस-एक्सप्रेशन-आधारित लाइसेंस उत्पन्न कर सकता है, एक डेबियन सर्वर पर चल रहा एक सीएलआईएसपी प्रोग्राम उस ऑब्जेक्ट में लापता डिजिटल हस्ताक्षर फ़ील्ड को भर सकता है, और इसे वापस भेज सकता है। विंडोज प्रोग्राम जो हस्ताक्षर को मान्य कर सकता है।
सर्वर पर, CGI- आधारित लाइसेंसिंग सेवा के अलावा, मैं लाइसेंस के प्रबंधन के लिए सरल कमांड लाइन एपीआई हूं। आप लाइसेंस को सूचीबद्ध कर सकते हैं, विशिष्ट लोगों को ढूंढ सकते हैं, और उनकी विशेषताओं को संपादित कर सकते हैं: जैसे कि उपयोगकर्ता को अपवाद देने के लिए अस्थायी लाइसेंस की समाप्ति तिथि को संपादित करना। लाइसेंसिंग बैक-एंड भी ई-मेल जेनरेट करता है। मैंने सर्वर साइड पर सीजीआई से निपटने के लिए किसी भी लाइब्रेरी का उपयोग नहीं किया: अपाचे पर्यावरण चर और कमांड लाइन तर्कों से निपटने के लिए बस हाथ से लुढ़का लिस्प कोड। (हालांकि लाइब्रेरी कोड का उपयोग URL एन्कोडिंग और HTML पीढ़ी से निपटने के लिए किया जाता है।) भंडारण के लिए किसी डेटाबेस का उपयोग नहीं किया जाता है; लाइसेंस एक फ़ाइल में catenated कहा जाता है licenses.lisp
और वह है।