我很难找到答案,所以也许这是不可能的。我希望能够从命令行中加载/编译一个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/

10-16 23:44