2012-02-10 10 views
13

वर्तमान में मेरे पास आम लिस्प में एक छोटा सा कार्यक्रम है, जिसे मैं एक शैल स्क्रिप्ट के रूप में चलाने के लिए चाहता हूं। मैं एसबीसीएल का उपयोग कर रहा हूं और इसके साथ पूरी तरह ठीक हूं इसलिए इस मंच पर रहना पसंद करेंगे। :)सीएल प्रोग्राम को शेल स्क्रिप्ट के रूप में बुलाए जाने पर quicklisp का उपयोग कैसे करें?

मुझे --script विकल्प के बारे में पता है और यह (ql:quickload) फ़ॉर्म को छोड़कर बेकार ढंग से काम करता है।

मेरा प्रोग्राम CL-FAD का उपयोग करता है, जो ql:quickload के माध्यम से लोड होता है (मुझे लगता है कि मुझे यह उल्लेख करना चाहिए कि यह quicklisp से पैकेज लोडिंग फ़ंक्शन है)। जब स्क्रिप्ट

(ql:quickload :cl-fad) 

प्रपत्र का मूल्यांकन करने के लिए चलाता है, यह अगले त्रुटि के साथ टूट जाता है:

package "QL" not found 

कार्यक्रम ही स्रोत फ़ाइल, में पैक किया जाता है जो शीर्ष लेख निम्नलिखित है:

(defpackage :my-package 
    (:use :common-lisp) 
    (:export :my-main-method)) 

यह सरल स्वचालन निष्पादन योग्य है, इसलिए मैंने किसी भी एएसडीएफ सिस्टम को नहीं लिखने का फैसला किया (शायद गलती से)। यह एकल समारोह निर्यात करता है जिसे किसी भी तर्क के बिना चलाया जाना चाहिए।

इस कार्यक्रम के लिए मैं वर्तमान लांचर स्क्रिप्ट लिखने की कोशिश कर रहा हूँ, और यह है कि मैं क्या घूर रहा है:

#!/usr/bin/sbcl --script 
(load "my-program.lisp") 
(in-package :my-package) 
(my-main-method) 

इस तीन लाइनें (कुटिया गिनती नहीं) है जो मैं स्वचालित करना चाहते हैं रहा हूँ। जैसा कि मैंने प्रलेखन में पढ़ा है, इस शेबैंग के साथ स्क्रिप्ट को सरल ./script.lisp कहा जा सकता है, और यह वास्तव में ऐसा करता है ... पहले वर्णित त्रुटि के साथ।

मुझे ठीक से लोड करने के लिए :cl-fad के लिए लॉन्चर में जोड़ने की क्या ज़रूरत है? प्रलेखन कहा गया है कि --script विकल्प के साथ SBCL किसी भी init फ़ाइल को लोड नहीं है, इसलिए मैं वास्तव में लाइनों

#-quicklisp 
(let ((quicklisp-init (merge-pathnames "systems/quicklisp/setup.lisp" 
             (user-homedir-pathname)))) 
    (when (probe-file quicklisp-init) 
    (load quicklisp-init))) 

(जो ql:add-to-init-file .sbclrc को कहते हैं), मेरे लॉन्चर स्क्रिप्ट के copypaste की जरूरत है? शायद मेरे प्रोग्राम सेटअप में कुछ गहरी वास्तुशिल्प दोष हो सकती है?

और हाँ, जब मैं उन लाइनों में प्रवेश करता हूं जिन्हें मैं एसईबीएल में स्वयं आरईपीएल में स्वचालित करने की कोशिश करता हूं, तो प्रोग्राम अपेक्षित चलता है।

उत्तर

7

कोर छवि का एक समर्पित संस्करण बनाना एक अच्छा विकल्प है। आप कर सकते हैं:

  1. लोड quicklisp और sb-ext:save-lisp-and-die एक नई छवि में।तुम्हें पता है, नाम के एक खोल/बल्लेबाजी स्क्रिप्ट लिखने qlsbcl कहते हैं, इस तरह: http://gitorious.org/clbuild2 पर

    sbcl --core <my-new-image-full-path-location> "[email protected]" 
    
  2. हड़पने clbuild2 और clbuild lisp चलाते हैं। आप अपने रास्ते में एक द्विआधारी निर्देशिका के लिए clbuild सिमलिंक और कुछ स्क्रिप्ट थोड़ा tweak अगर आपके quicklisp आम जगह में नहीं है करना होगा ~/quicklisp (https://gist.github.com/1485836) या आप ASDF2 (https://gist.github.com/1621825) का उपयोग करें। ऐसा करके, clbuildquicklisp, ASDF और conf.lisp में जो भी आप जोड़ सकते हैं, के साथ एक नया कोर बनाएं। अब मामला कुछ ऐसा दिखाई देगा:

    #!/usr/bin/env sbcl --noinform --core <my-clbuild-install-directory>/sbcl-base.core --script 
    

clbuild का लाभ यह है कि आप आसानी से बना सकते हैं और sbcl के लिए खोल से कोर और quicklisp स्थापना का प्रबंधन (डिफ़ॉल्ट रूप से) हो सकता है या ccl64 कार्यान्वयन की तरह किसी भी अन्य आधुनिक सीएल । दो तकनीकों को मिलाकर (स्क्रिप्ट और clbuild) आपकी समस्या का समाधान करेंगे।

+0

मेरे पास अलग डीआईआर में quicklisp है और _yet_ अन्य स्क्रिप्ट को हैक करना नहीं चाहता। :) पहली विधि द्वारा कॉर्डम्पिंग बहुत अच्छा काम करता है, मेरे पास पहले से ही मेरे '~/bin' में कई लॉन्चर हैं। और डंप की गई छवि तेज रफ्तार से भी चलती है। %) – hijarian

+0

हां! छवियों के साथ काम करना बहुत अच्छा है! यही कारण है कि स्मॉलटाकर अपने मुस्कान के साथ दिन-प्रतिदिन काम शुरू करते हैं और जावा एक्लिप्स डेवलपर्स कॉफी के साथ अपना खुद का शुरू करते हैं। –

14

आप सब ठीक कर रहे हैं।

असल में, इससे पहले कि आप quicklisp का उपयोग कर सकें, आपको इसे लोड करने की आवश्यकता है (वर्तमान में, यह एसबीसीएल के साथ बंडल नहीं है, हालांकि यह भविष्य में बदल सकता है)। ऐसा करने के कई तरीके हैं। उदाहरण के लिए, आप quicklisp init के साथ अपने .sbclrc लोड कर सकते हैं:

#!/usr/bin/sbcl --script 
(load ".sbclrc") 
(load "my-program.lisp") 
(in-package :my-package) 
(my-main-method) 

या बस की तरह आप का सुझाव दिया है, अपनी स्क्रिप्ट में उन पंक्तियों पेस्ट करें।

+2

वाह, "आप सबकुछ सही कर रहे हैं" ... यह शब्द वास्तव में दुर्लभ हैं, धन्यवाद, @Vsevolod। आपके और मार्शल जवाब दोनों महान और काम कर रहे हैं, मुझे खेद है कि कोई केवल एक ही जवाब को चिह्नित कर सकता है। :) हालांकि मैं coredumping पसंद करते हैं, यह मुझे प्रत्येक स्क्रिप्ट में एक पंक्ति बचाता है जिसमें सब कुछ एक साथ सिम्लिंकिंग के रूप में तैयारी के छोटे ओवरहेड होते हैं। – hijarian

+2

@hijarian कोई समस्या नहीं है। जैसा कि मैंने कहा है। आपकी समस्या को हल करने के कई तरीके हैं। मुझे और भी जवाब देखने की उम्मीद है :) –

संबंधित मुद्दे