2009-05-07 61 views
24

给出一个简单的程序,如下面,你会如何:与Clozure Common Lisp的编译二进制

  1. 编译为一个单独的图像文件通过该实现加载,哪些命令行参数会吗用来加载它?

  2. 将其编译为可以按原样加载和运行的独立二进制文件。

    注意:我只是在保存应用程序时才添加“:prepend-kernel t”,以便抛出下面的错误。

    Error: value NIL is not of the 
    expected type REAL. While executing: 
    CCL::<-2, in process Initial(0). 
    
  3. 你怎么会剿欢迎消息?

    方案

    (defun main() 
        (format t "This is the program.")0) 
    

编辑

讨厌回答我的问题的一部分,但我发现它没有少。

功能已被加载类型之后下列编译它:

(ccl:save-application "app") 

这将创建的图像文件。通过将它传递给实现类型来加载它(注意:'ccl'二进制文件位于我的系统路径中);

ccl -I app 

要运行一个顶级功能把它作为一个参数

ccl -I app --eval (main) 

回答

28

参见下Saving Applications

的Clozure Common Lisp的文件编译和装载的Lisp文件

你可以通过调用

编译一个名为 /foo/bar.lisp的文件
(compile-file "/foo/bar.lisp") 

这将创建一个FasL的(快速加载)文件,其中包含本地代码。

您可以使用函数LOAD加载编译的文件fasl文件。 LOADCOMPILE-FILE是标准的普通唇部功能。

创建应用

一些定义:

  • CCL内核:CCL的部分提供内存管理低层次的运行时服务。
  • 图片:Lisp的堆
  • 应用的保存的转储:CCL内核+图像。这可以在一个文件中。

您可以通过调用CCL特定功能保存应用程序:

(save-application "/foo/bar-image" :toplevel-function #'main) 

这将保存图像时,您可以使用CCL内核从命令shell中运行:

ccl -I /foo/bar-image 

要保存包含内核的可执行文件,请从Lisp使用此文件:

(save-application "/foo/bar-app" :toplevel-function #'main :prepend-kernel t) 

您可以像命令shell一样使用/foo/bar-app像往常一样调用此可执行文件。

在Clozure Common Lisp中,你可以检查

*command-line-argument-list* 

对所提供的命令行参数的清单。

+0

修正了错误。 此外,应用程序是按预期创建的,但是当我尝试加载exe时,错误消息告诉我“程序太大而不适合内存”。你之前遇到过这种情况吗?知道修复? – BlueBadger 2009-05-07 08:51:55

+0

看到我的编辑,使用prepend-kernel将内核添加到文件 – 2009-05-07 08:57:25

+0

我在Windows实现中测试了所有这些内容,并收到了所提及的各种错误。我只是在一台Linux机器上测试它,并且它按预期工作。谢谢。 – BlueBadger 2009-05-07 09:16:37