我尝试了以下内容:
$ cat args.sh
\#! /Applications/ccl/dx86cl64
(format t "~&~S~&" *args*)
$ ./args.sh
无法从./args.sh
我可以直接运行lisp:
$ /Applications/ccl/dx86cl64
Welcome to Clozure Common Lisp Version 1.5-r13651 (DarwinX8664)!
?
是否可以编写shell脚本以使用Clozure CL运行lisp代码?我确信我做的事情很傻。
安装的答案 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
...