Lisp可执行文件

我刚刚开始学习Lisp,我无法弄清楚如何将lisp代码编译并链接到可执行文件。

我正在使用clispclisp -c产生两个文件:

  • .fas
  • 的.lib

接下来我要做什么来获取可执行文件?

我实际上是在今天尝试这样做,而我发现在CLisp REPL中input了这个内容:

 (EXT:SAVEINITMEM "executable.exe" :QUIET t :INIT-FUNCTION 'main :EXECUTABLE t :NORC t) 

其中main是程序启动时要调用的函数的名称:QUIET t禁止启动横幅, :EXECUTABLE t使本机可执行文件成为可执行文件。

呼叫也是有用的

 (EXT:EXIT) 

在主函数的最后,以便在程序完成时阻止用户获得交互式的lisp提示。

编辑:阅读文档,您可能还需要添加:NORC t (阅读链接 )。 这会禁止加载RC文件(例如~/.clisprc.lisp )。

这是一个Lisp常见问题 (稍作改动):

***我如何从我的程序做一个可执行文件?

这取决于你的实现; 您将需要咨询您的供应商的文档。

  • 使用ECL和GCL,标准的编译过程将生成一个本地可执行文件。

  • 使用LispWorks,请参阅文档的交付用户指南部分。

  • 使用Allegro Common Lisp,请参阅手册的交付部分。

  • 等等…

然而,与Common Lisp程序交互的经典方式并不涉及独立的可执行程序。 让我们在开发过程的两个阶段考虑这个:编程和交付。

编程阶段 :Common-Lisp开发比在面向批处理的语言中有更多的增量感觉,其中编辑 – 编译 – 链接周期是常见的。 CL开发人员将在REPL(或Read-Eval-Print-Loop,也称为侦听器 )上运行简单的testing和与环境的瞬间交互。 源代码保存在文件中,并且源文件之间的构build/加载依赖关系被logging在诸如ASDF(在编辑 – 编译链接系统中起类似作用)的系统描述设施中。 系统描述工具提供了用于构build系统的命令(并且仅重新编译自从上次构build以来相关性已经改变的文件),并且将系统加载到内存中。

最常见的Lisp实现还提供了一种“保存世界”机制,可以将当前lisp映像的快照保存为稍后可以重新启动的forms。 Common Lisp环境通常包含一个相对较小的可执行运行时,以及一个包含lisp世界状态的较大图像文件。 此工具的一个常见用途是转储包含在给定项目上使用的所有构build工具和库的定制映像,以缩短启动时间。 例如,CMUCL中的EXT:SAVE-LISP,SBCL中的SB-EXT:SAVE-LISP-AND-DIE,CLISP中的EXT:SAVEINITMEM,以及OpenMCL中的CCL:SAVE-APPLICATION。 这些实现中的大多数可以将运行时间预先加载到映像,从而使其可执行。

应用程序交付 :Lisp开发人员通常不会为应用程序生成单个可执行文件,而是通常会保存包含其应用程序的映像,并将其与运行时一起交付给客户端,还可能会使用应用程序映像调用运行时的shell脚本包装器。 在Windows平台上,通过使用Click-o-matic InstallShieldtypes的工具,用户可以将其隐藏起来。

看看官方的clisp主页。 有一个常见问题回答这个问题。

http://clisp.cons.org/impnotes/faq.html#faq-exec

CLiki也有一个很好的答案: 创build可执行文件

对于一个便携的方式来做到这一点,我推荐roswell 。

对于任何受支持的实现,您可以创buildlisp脚本来运行程序,可以通过可移植的方式运行程序,可以在类似于python或ruby程序的散列行中使用。

对于SBCL和CCL,roswell也可以使用ros dump executable创build二进制可执行ros dump executable

;; 我知道这是一个老问题,但我正在看的Lisp代码是25岁:-)

我无法在Windows 10上使用clisp进行编译。但是,它在gcl中对我有效

https://www.cs.utexas.edu/users/novak/gclwin.html

;; 我的lisp文件是jugs2.lisp

gcl -compile jugs2.lisp ;; 这将产生文件jugs2.o如果jugs2.lisp文件没有错误

;; 运行不带参数的gcl来启动lisp解释器gcl

;; 加载.o文件

(加载“jugs2.o”)

;; 创build一个exe

(si:save-system“jugs2”)

;; 当exe运行时,需要dll oncrpc.dll ;; 这是在gcl.bat创build的\ lib \ gcl-2.6.1 \ unixport文件夹中。

;; 运行时显示一个lisp环境,调用(main)运行main函数(main)