2011-02-06 23 views
9

Tôi chỉ mới bắt đầu với lisp thông thường, có nguồn gốc từ C++ và Python. Tôi đang cố gắng để chạy một chương trình SDL đơn giản mà không có gì khác hơn là hiển thị một hình ảnh trên màn hình. Tôi có thể làm cho nó hoạt động từ bên trong SLIME. Vấn đề là, nó sẽ không hoạt động khi chạy từ trình bao dưới dạng tập lệnh.lisp như một kịch bản shebang vs lisp chạy trong SLIME

chương trình của tôi trông như thế này:

#!/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) 

Khi tôi chạy như một kịch bản, tôi nhận được lỗi sau:

[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] 

(... backtrace dài bỏ qua)

Oddly, chương trình này hoạt động tốt nếu tôi làm như sau. Tôi mở chương trình trong Emacs, bắt đầu SLIME trong một cửa sổ khác, và trong cửa sổ SLIME, tôi nhập dòng đầu tiên của chương trình:

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

Sau đó, trong cửa sổ soạn thảo, tôi nhấn Cc Ck (biên dịch/tải tập tin). Điều này bật lên một cửa sổ hiển thị image.png, như mong đợi.

Tại sao tính năng này không hoạt động khi chạy dưới dạng tập lệnh shebang? Làm thế nào tôi có thể sửa chữa nó?

Trả lời

7

Như man page của sbcl nói, --script ngụ ý --no-sysinit --no-userinit --disable-debugger --end-toplevel-options, có nghĩa là các file khởi tạo không được đọc, và vì vậy nếu bạn thiết lập registry asdf đó nó không được thiết lập, và vì vậy nó không thể tìm thấy hệ thống lispbuilder-sdl. Bạn cần thiết lập đăng ký trong tập lệnh, hoặc save an executable core với đăng ký đã được thiết lập và gọi thay vì sbcl mặc định. Thông thường bạn cũng có thể lưu các thư viện trong lõi thay vì tải chúng trong kịch bản, nhưng tôi không hoàn toàn chắc chắn cách tương tác với các thư viện và các tài nguyên không phải của Lisp.

0

Cách thông thường khi phát triển trong lisp là sử dụng ASDF để mô tả dự án và các phụ thuộc của dự án. Sau đó, bạn có thể dễ dàng (asdf:oos 'asdf:load-op :yourapp).

Đối với hầu hết các triển khai, có một cách để tạo định dạng asdf biểu mẫu thực thi.