我刚刚开始学习Lisp,我不知道如何编译Lisp代码并将其链接到可执行文件。

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

  • .fas
  • .lib

接下来我该怎么做才能获得可执行文件?

===============>>#1 票数:48 已采纳

我实际上今天正在尝试执行此操作,但发现在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 )。

===============>>#2 票数:35

这是一个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类型工具将其从用户隐藏起来。

===============>>#3 票数:14

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

===============>>#4 票数:14

看看官方的剪辑首页。 有一个常见问题解答可以回答这个问题。

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

===============>>#5 票数:3

对于便携式方法,建议使用roswell

对于任何受支持的实现,您都可以创建lisp脚本来运行该程序,该程序可以由ros以可移植的方式运行,并且可以用在hash-bang行中,类似于python或ruby程序。

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

===============>>#6 票数:-1

我知道这是一个老问题,但是我正在查看的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)。

  ask by Alexander Stolz translate from so

未解决问题?本站智能推荐:

1回复

如何执行已存储在变量中的Lisp程序?

我有以下代码: 我需要添加更多代码,以便在执行上述代码时,应将n设置为1并执行存储在变量prg中的程序。
3回复

Lisp函数:联合

我有一个lisp作业,我很难用它。 我必须编写一个执行联合操作的函数。 该函数采用2个输入,以原子或列表的形式和每个元素的联合,保留顺序并剥离所有级别的括号。 功能的输出: 我对lisp很新。 这是我到目前为止所写的内容,它仅适用于第三个示例: 任何帮助,将不胜感
1回复

Lisp中的圆形指针

在研究《 CLRS算法入门》一书并尝试以通用Lisp实现红黑二进制搜索树时,我遇到了以下带有循环指针的问题: 此代码导致堆耗尽错误,大概是由于具有指向该指针的指针的指针引起的无限递归等。 有没有办法在保持此处给出的指针结构的同时防止这种无限递归的发生? 我知道还有其他方法可以
5回复

LISP或Haskell [关闭]

LISP或Haskell,我需要学习函数式编程,但是我听说lisp很老了,这两种语言之间有什么建议吗?
3回复

Lisp代码没有响应

剧透警报:这是Euler项目第7号的答案。 我正在学习Lisp而我正在使用compileonline.com来运行我的代码。 虽然在一个简单的程序上内存不足,所以我切换到桌面版本。 但是,即使这样也会耗尽内存。 有人能告诉我为什么这么糟糕吗? 在它当前的形式它不会挂起,但如果我
3回复

Lisp,如何消除重启

我对Lisp很陌生。 当我在恶劣的环境中玩耍时,我经常犯错,但随后立即受到一长串惩罚,例如 这只会破坏我的屏幕,而我看不到任何先前的命令。 有人知道如何消除此提示吗?
1回复

比较Lisp中的列表

我可以想办法自己做一些事情,但我觉得有一个更简单,也许是内置的方法来做到这一点。 我想看看是否有任何两个列表共享一个元素。 这些是我目前正在处理的两个列表: 由于两个列表都包含(1 3 7) ,我想比较列表以返回T 除了设置几个DOLIST之外,还有更好的方法吗?
1回复

在Lisp编程中返回值

我有一个功能 (defun read-as-list (filename) (defparameter parlist(list nil) ) (let ((in (open filename :if-does-not-exist nil))) (when i
4回复

LISP的哪个版本具有putprop?

据称,我正在破解一个旧的Lisp程序,该程序曾经在Franz LISP中编译并工作。 但是Franz LISP太旧了,因此我正在尝试CLISP编译器。 但是,CLISP没有putprop 。 我意识到我可以编写一个功能与putprop相同的putprop ,但是如果我不得不执行进一步的
3回复

将lisp命令回显到stdout

是否有任何命令将所有后续lisp命令回显到stdout? 我正在寻找类似于bash -x的东西,但需要一些Lisp解释器(或某种Lisp风格,特别是GNU Common Lisp)。