从终端命令提示符运行Common Lisp函数

问题描述 投票:13回答:4

我很难找到答案,所以也许是不可能的。我希望能够从命令行加载/编译lisp文件(即不在emacs内)然后再从命令行运行该文件中的lisp函数之一的灵活性。毫无疑问,这是特定于实现的功能,因此提供此功能的实现的任何指针(或者也许是相当标准的,我不知道)。我正在使用SBCL并喜欢它,所以如果能这样做,那就太好了。

我也正在使用Mac OSX和Terminal。

lisp common-lisp sbcl
4个回答
23
投票

SBCL手册描述了三个有用的选项

3.3.1 Runtime Options

--noinform禁止打印任何横幅或其他启动时的参考消息。这使得编写Lisp更容易在Unix管道中可以正常工作的程序。另请参阅--noprint--disable-debugger选项。

3.3.2 Toplevel Options

--eval command在执行任何初始化文件之后,但是在对标准输入启动read-eval-print循环之前,请读取并评估给出的命令。可以使用多个--eval选项,并且所有将按照它们在命令中出现的顺序进行读取和执行线。

--load filename这等效于--eval '(load "filename")'。特殊语法旨在减少调用时的引用头痛Shell脚本中的SBCL。

提供包含内容的文件test.lisp

(defun hello-world ()
  (print 'hello-world)
  (terpri))

我们可以使用SBCL执行此操作:

$ sbcl --noinform --load test.lisp --eval '(progn (hello-world) (sb-ext:quit))'

HELLO-WORLD 

(progn ... (sb-ext:quit))确保在执行(hello-world)之后程序结束。否则,您将进入SBCL提示符。由于代码是在SBCL中自动编译的,因此您正在运行的函数在运行(hello-world)时已经被编译。如果预先编译了文件,则可以将编译后的文件传递给--load。例如,>

$ sbcl --noinform --load test.fasl --eval '(hello-world)'

HELLO-WORLD 

实际上,考虑到--load--eval (load "filename")的等效性,您可以仅使用文件名的基数,如果有编译版本,则SBCL应该加载该文件,如果没有,则SBCL将加载。源文件,您将通过这种方式获得编译后的代码。例如,在下面,我们仅使用--load test

$ sbcl --noinform --load test --eval '(hello-world)'

HELLO-WORLD 

4
投票

以下是来自first google result的粘贴:


1
投票

正如其他人所展示的,几乎所有的实现都有一些通过终端运行Lisp代码的方式。还有一些包装器为许多实现提供了公共接口:CIMcl-launch


0
投票

我正在尝试通过knitr将sbcl Common-Lisp集成到R中。这里有一些关于如何将评估请求发送到sbcl,然后将其返回给R的测试。这适用于发送表单而不是文件。从终端:

© www.soinside.com 2019 - 2024. All rights reserved.