使用Clozure Common Lisp编译二进制文件

Blu*_*ger 24 executable compilation 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).
    
    Run Code Online (Sandbox Code Playgroud)
  3. 你会如何压制欢迎信息?

    该程序

    (defun main ()
      (format t "This is the program.")0)
    
    Run Code Online (Sandbox Code Playgroud)

编辑

讨厌回答我自己的一部分问题,但我发现了它.

加载函数后,键入以下内容进行编译:

(ccl:save-application "app")
Run Code Online (Sandbox Code Playgroud)

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

ccl -I app
Run Code Online (Sandbox Code Playgroud)

要运行顶级函数,请将其作为参数传递

ccl -I app --eval (main)
Run Code Online (Sandbox Code Playgroud)

Rai*_*wig 29

请参阅" 保存应用程序"下的Clozure Common Lisp文档

编译和加载Lisp文件

您可以编译/foo/bar.lisp通过调用命名的文件

 (compile-file "/foo/bar.lisp")
Run Code Online (Sandbox Code Playgroud)

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

您可以使用该函数加载已编译的文件fasl文件LOAD.LOAD并且COMPILE-FILE是标准的Common Lisp函数.

创建应用程序

一些定义:

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

您可以通过调用CCL特定函数来保存应用程序:

(save-application "/foo/bar-image" :toplevel-function #'main)
Run Code Online (Sandbox Code Playgroud)

这将保存一个可以使用命令shell中的CCL内核运行的映像:

ccl -I /foo/bar-image
Run Code Online (Sandbox Code Playgroud)

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

(save-application "/foo/bar-app"
                  :toplevel-function #'main
                  :prepend-kernel t)
Run Code Online (Sandbox Code Playgroud)

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

在Clozure Common Lisp中你可以查看

*command-line-argument-list*
Run Code Online (Sandbox Code Playgroud)

提供的命令行参数列表.