2013-12-14 44 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