我很难找到答案,所以也许这是不可能的。我希望能够从命令行中加载/编译一个LISP文件,即不在Emacs里面,也可以从命令行中运行该文件中的一个LISP函数。这无疑是特定于实现的特性,因此实现上提供此特性的任何指针(或者它可能是相当标准的,我不知道)我正在使用SBCL并且喜欢它,所以如果能做到这一点就太好了。
我也在使用Mac OSX和终端。
最佳答案
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。
给定一个包含内容的文件
(defun hello-world ()
(print 'hello-world)
(terpri))
我们可以用SBCL做到这一点:
$ sbcl --noinform --load test.lisp --eval '(progn (hello-world) (sb-ext:quit))'
HELLO-WORLD
test.lisp
确保程序在执行(progn ... (sb-ext:quit))
后结束否则,您将进入SBCL提示符因为代码是在SBCL中自动编译的,所以您正在运行的函数已经在运行(hello-world)
时编译好了如果您事先编译了该文件,则可以将编译后的文件传递给(hello-world)
。例如。,$ sbcl --noinform --load test.fasl --eval '(hello-world)'
HELLO-WORLD
事实上,假设
--load
与--load
等价,您可以只使用文件名的基,如果有编译的版本,那么SBCL应该加载它,如果没有,那么SBCL将加载源文件,您将得到这样的编译代码例如,在下面,我们只使用--eval (load "filename")
:$ sbcl --noinform --load test --eval '(hello-world)'
HELLO-WORLD
关于lisp - 从终端命令提示符处运行Common Lisp函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20301668/