[英]Lisp Executable
我刚刚开始学习Lisp,我不知道如何编译Lisp代码并将其链接到可执行文件。
我正在使用clisp
和clisp -c
生成两个文件:
接下来我该怎么做才能获得可执行文件?
我实际上今天正在尝试执行此操作,但发现在CLisp REPL中键入以下内容有效:
(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程序进行交互的经典方式不涉及独立的可执行文件。 让我们在开发过程的两个阶段中考虑一下:编程和交付。
编程阶段 :与面向批处理的语言相比,常见的Lisp开发具有增量的感觉,在面向批处理的语言中,其编辑-编译-链接周期很常见。 CL开发人员将在REPL(或Read-Eval-Print-Loop,也称为侦听器 )上运行简单的测试以及与环境的短暂交互。 源代码被保存在文件中,文件和源文件之间的构建/负载依存关系被记录在一个系统描述设施如ASDF(起着类似的作用,在编辑编译链接系统, 使 )。 系统描述工具提供用于构建系统的命令(并且仅重新编译自上次构建以来其依赖关系已更改的文件),以及用于将系统加载到内存中的命令。
大多数Common Lisp实现还提供了一种“保存世界”机制,该机制可以保存当前Lisp映像的快照,并且可以稍后重新启动该窗体。 Common Lisp环境通常由相对较小的可执行运行时和包含Lisp世界状态的较大映像文件组成。 此功能的常见用途是转储包含给定项目中使用的所有构建工具和库的自定义映像,以减少启动时间。 例如,此功能在CMUCL中的名称为EXT:SAVE-LISP,在SBCL中的名称为SB-EXT:SAVE-LISP-AND-DIE,在CLISP中的名称为EXT:SAVEINITMEM以及在OpenMCL中的名称为CCL:SAVE-APPLICATION。 这些实现中的大多数可以将运行时放在映像之前,从而使其可执行。
应用程序交付 :Lisp开发人员通常不保存用于应用程序的单个可执行文件,而是保存包含其应用程序的映像,并将其与运行时以及可能会与应用程序映像一起调用运行时的外壳脚本包装一起交付给客户端。 在Windows平台上,可以使用Click-o-matic InstallShield类型工具将其从用户隐藏起来。
CLiki也有一个很好的答案: 创建可执行文件
看看官方的剪辑首页。 有一个常见问题解答可以回答这个问题。
对于便携式方法,建议使用roswell 。
对于任何受支持的实现,您都可以创建lisp脚本来运行该程序,该程序可以由ros
以可移植的方式运行,并且可以用在hash-bang行中,类似于python或ruby程序。
对于SBCL和CCL,roswell还可以使用ros dump executable
创建二进制可执行ros dump executable
。
我知道这是一个老问题,但是我正在查看的Lisp代码已有25年的历史了:-)
我无法在Windows 10上使用clisp进行编译。但是,使用gcl对我有用 。
如果我的Lisp文件是jugs2.lisp,
gcl -compile jugs2.lisp
如果jugs2.lisp文件没有错误,则生成文件jugs2.o。
运行不带参数的gcl以启动lisp解释器:
gcl
加载.o文件:
(load "jugs2.o")
要创建一个EXE:
(si:save-system "jugs2")
运行EXE时需要DLL oncrpc.dll
; 这位于gcl.bat创建的<gcl install folder>\\lib\\gcl-2.6.1\\unixport
文件夹中。
运行时会显示一个Lisp环境,调用(main)以运行main函数(main)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.