2011-02-06 16 views
9

में चल रहे एक शेबैंग स्क्रिप्ट बनाम लिस्प के रूप में लिस्प मैंने सी ++ और पायथन से आने वाले सामान्य-लिस्प के साथ शुरू किया। मैं एक साधारण एसडीएल प्रोग्राम चलाने की कोशिश कर रहा हूं जो स्क्रीन पर एक छवि दिखाने के अलावा कुछ भी नहीं करता है। मैं इसे एसएलईएमई के भीतर से काम कर सकता हूं। समस्या यह है कि, जब स्क्रिप्ट से स्क्रिप्ट के रूप में चलाया जाता है तो यह काम नहीं करेगा।एसआईएलएमई

मेरे कार्यक्रम इस प्रकार है:

#!/usr/bin/sbcl --script 

(asdf:operate 'asdf:load-op :lispbuilder-sdl) 

(defun main() 
    (sdl:with-init() 
    (sdl:window 320 240) 
    (sdl:draw-surface (sdl:load-image "image.png")) 
    (sdl:update-display) 
    (sdl:with-events() 
     (:quit-event() t) 
     (:video-expose-event() (sdl:update-display))))) 

(main) 

जब मैं एक स्क्रिप्ट के रूप में इस चलाने के लिए, मैं निम्नलिखित त्रुटि मिलती है:

[email protected]:~/projects/common-lisp/sandbox$ ./hello-world.lisp 
unhandled ASDF:MISSING-COMPONENT in thread #<SB-THREAD:THREAD "initial thread" RUNNING {AA5E849}>: 
    component "lispbuilder-sdl" not found 

0: (SB-DEBUG::MAP-BACKTRACE #<CLOSURE (LAMBDA #) {AAF1EF5}>)[:EXTERNAL] 

(... लंबे पश्व-अनुरेखन छोड़े गए)

विचित्र रूप से, यदि मैं निम्नलिखित करता हूं तो यह प्रोग्राम ठीक काम करता है। मैं खोलने Emacs में कार्यक्रम, अन्य विंडो में कीचड़ प्रारंभ करें, और कीचड़ विंडो में, मैं इस कार्यक्रम की पहली पंक्ति दर्ज करें:

(asdf:operate 'asdf:load-op :lispbuilder-sdl) 

फिर, संपादक विंडो में, मैं प्रतिलिपि Ck (संकलन/लोड मारा फ़ाइल)। यह अपेक्षित के रूप में image.png दिखा रहा एक खिड़की पॉप अप करता है।

शेबैंग स्क्रिप्ट के रूप में चलाने पर यह क्यों काम नहीं करता है? मेरे द्वारा यह कैसे किया जा सकता है?

उत्तर

7

SBCL के लिए आदमी पृष्ठ कहते हैं, --script--no-sysinit --no-userinit --disable-debugger --end-toplevel-options का तात्पर्य, जिसका अर्थ है कि प्रारंभ फ़ाइलों को पढ़ने के लिए नहीं कर रहे हैं, और इसलिए यदि आप वहाँ ASDF रजिस्ट्री की स्थापना की यह सेट नहीं है, और इसलिए यह lispbuilder-sdl प्रणाली नहीं मिल रहा। आपको या तो रजिस्ट्री में रजिस्ट्री को सेट करने की आवश्यकता है, या save an executable core रजिस्ट्री के साथ पहले से सेट अप किया गया है और डिफ़ॉल्ट sbcl के बजाय उसे कॉल करने की आवश्यकता है। आमतौर पर आप उन्हें स्क्रिप्ट में लोड करने के बजाय कोर में पुस्तकालयों को भी सहेज सकते हैं, लेकिन मुझे पूरा यकीन नहीं है कि यह गैर-लिस्प पुस्तकालयों और संसाधनों के साथ कैसे इंटरैक्ट करता है।

0

एलआईएसपी में विकसित होने का सामान्य तरीका प्रोजेक्ट और इसकी निर्भरताओं का वर्णन करने के लिए ASDF का उपयोग करना है। फिर, आप आसानी से (asdf:oos 'asdf:load-op :yourapp) कर सकते हैं।

अधिकांश कार्यान्वयन के लिए निष्पादन योग्य फॉर्म asdf परिभाषा उत्पन्न करने का एक तरीका है।