如何从OS X上的shell脚本运行Clozure CL(Lisp)?

时间:2010-08-08 15:57:06

标签: lisp common-lisp

我尝试了以下内容:

$ cat args.sh
\#! /Applications/ccl/dx86cl64
(format t "~&~S~&" *args*)

$ ./args.sh 

无法从./args.sh

加载lisp堆映像

我可以直接运行lisp:

$ /Applications/ccl/dx86cl64
Welcome to Clozure Common Lisp Version 1.5-r13651  (DarwinX8664)!

? 

是否可以编写shell脚本以使用Clozure CL运行lisp代码?我确信我做的事情很傻。

我是从http://openmcl.clozure.com/

安装的

5 个答案:

答案 0 :(得分:6)

跟随查理马丁的回答以及随后的问题。 dx86cl64 --eval <code>将启动REPL,因此如果您要启动给定的脚本然后退出,只需将其添加到脚本的末尾:(ccl::quit)。在您提供的示例中,这可以解决问题:

#! /bin/bash 
exec /Applications/ccl/dx86cl64 --eval '(progn (format t "hello script") (ccl::quit))'

更好的脚本如下:

#! /bin/bash
exec /Applications/ccl/dx86cl64 -b -e '(progn (load "'$1'") (ccl::quit))'

将其放入文件load-ccl-script.sh(或您选择的其他名称)中。然后以下交互工作:

$ echo '(format t "weeee!")' > a.lisp
$ sh load-ccl-script.sh a.lisp
weeee!
$ _

答案 1 :(得分:2)

问题出在你的shebang专栏:

\#! /Applications/ccl/dx86cl64

在UNIX文件中,前16位称为“幻数”。碰巧可执行脚本的幻数与字符“#!”的位配置相同。文件的前16位与“\#”具有相同的配置,UNIX不会购买。

可以添加幻数,但它不容易或者不便携,所以你需要的是一种调用脚本的方法。我建议

#! /bin/bash
exec /Applications/ccl/dx86cl64 

为您的脚本提供适当的参数等。 (exec内置导致当前进程使用指定的可执行文件加载而不会分支,因此您没有备用进程。)

<强> 更新

在您的特定情况下,您需要类似

的内容
@! /bin/bash
exec /Applications/ccl/dx86cl64 --eval '(format t "~&~S~&" *args*)'

请参阅command line args for Clozure了解原因。

答案 2 :(得分:0)

您必须确保内核可以加载Lisp内存映像。默认行为是内核查找文件,该文件的名称类似于附加了“.image”的内核二进制文件,即,如果使用dx86cl64启动CCL,则加载的图像为dx86cl64.image来自同一目录。您可以使用--image选项明确提供图像来修改此行为。请尝试dx86cl64 --help了解详情。

答案 3 :(得分:0)

请参阅ccl目录的scripts子目录。它应该有一些你可以适应和使用的脚本。

答案 4 :(得分:0)

您不能从命令行调用这样的脚本:

/Applications/ccl/dx86cl64 myscript
你可以吗?

我认为你需要像这样调用它(我这里没有Clozure CL,所以我无法测试):

/Applications/ccl/dx86cl64 -b -l myscript

所以,你的脚本应该这样开始:

#!/Applications/ccl/dx86cl64 -b -l
...