2013-12-14 75 views
2

我是新來的CL,我無法弄清楚如何從我的簡單項目構建二進制文件。如何構建Common Lisp項目?

我創建app.asd文件,內容如下:

(asdf:defsystem game 
    :version "0.0.1" 
    :components ((:file "package") 
       (:file "main"))) 

package.lisp內容

(defpackage :app 
    (:use :common-lisp :asdf) 
    (:export :start)) 

main.lisp

(in-package :app) 

(defun start (args) 
    (format t "Hello")) 

我也符號鏈接app.asd~/quicklisp/quicklisp/app.asd,當我執行

(require 'asdf) 
(asdf:operate 'asdf:load-op :app) 

它看起來像東西編譯,但我無法找到任何地方的二進制文件/目標文件。

如何建立我的項目,所以我可以把它複製到另一臺機器上沒有安裝CL和運行?

我在osx上使用sbcl 1.1.13和asdf 3.0.2。

回答

8

不要把.asd文件中~/quicklisp/quicklisp/。改爲使用~/quicklisp/local-projects/

的語法爲您start defun定義是錯誤的。它需要一個lambda列表。

Common Lisp中是經常使用的啓動環境,加載應用程序,然後調用交互由應用程序定義的功能。加載過程將源代碼編譯爲機器代碼,並且您交互調用的函數是編譯函數。

當我想要做一個二進制文件,我可以在命令行中運行,我用buildapp。在你的情況,你可以做這樣的事情:

sbcl --no-userinit --no-sysinit --non-interactive --load ~/quicklisp/setup.lisp \ 
    --eval '(ql:write-asdf-manifest-file "systems.txt")' 

buildapp --manifest-file systems.txt \ 
    --manifest-file ~/quicklisp/local-projects/system-index.txt \ 
    --load-system game \ 
    --entry app::start \ 
    --output game 

在這個方案中,你將不得不修改app::start接受一個參數,包含所有傳遞給game命令行參數字符串列表。

一般來說,最常見的Lisp有一些方法來生成二進制程序正常運行時的獨立運行。術語各不相同,但通常稱爲「交付」。如果將來使用不同的Common Lisp,如果您搜索文檔以獲取有關傳遞的信息,則可能會獲得更多信息。

+0

我得到'致命的MISSING-COMPONENT:組件「遊戲」未找到「。 – lambdas

+0

這可能是system-index.txt還沒有包含你的遊戲系統;如果您以交互方式加載它,或者將另一批次調用添加到sbcl以加載它,它可能會顯示在那裏。 – Xach

+0

謝謝,它現在有效。 – lambdas