2010-08-08 74 views
8

我试过如下:如何从OS X上的shell脚本运行Clozure CL(Lisp)?

$ 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代码?我确信我正在做一些愚蠢的事情。

我从安装了它:http://openmcl.clozure.com/

回答

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! 
$ _ 
+0

谢谢! (我猜'sh'在'sh load-ccl-script.sh a.lisp'中是多余的......) – 2010-08-10 11:21:44

+0

是的,但没有它,我不得不包含'chmod + x load-ccl-script。 sh'行 - 3个字符更简洁一点,因为这不是该片段的目的,我去懒惰的方式:) – Edgar 2010-08-10 17:09:20

0

你必须确保,内核可以加载一个Lisp内存映像。缺省行为是内核寻找一个文件,该文件的名称与添加了“.image”的内核二进制文件相同,即如果使用dx86cl64启动CCL,则加载的映像为dx86cl64.image。您可以通过使用--image选项明确提供图像来修改此行为。尝试dx86cl64 --help了解更多信息。

2

的问题是你的家当行:

\#! /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为什么。

+0

感谢您的建议。我试过这个: #!/bin/bash exec/Applications/ccl/dx86cl64 --eval'(format t“hello script”)' 工作原理,只是在方法执行后我得到了lisp提示。我怎样才能退出循环? $ ./args.sh hello脚本 欢迎来到Clozure Common Lisp版本1.5-r13651(DarwinX8664)! ? – 2010-08-09 02:50:20

+0

(再见)我相信。 – 2010-08-10 00:56:07

+1

至少直到Clozure 1.4'(bye)'不可用。 '(ccl :: quit)',但是,(因此'(quit)'也可以工作,如果你在'ccl'包中)。 – Edgar 2010-08-10 17:14:45

0

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

+0

我做到了。不幸的是,它们不是lisp代码脚本,而是shell实用程序。 – 2010-08-09 02:53:22

0

不能从命令行调用此类脚本:

/Applications/ccl/dx86cl64 myscript 

可以吗?

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

/Applications/ccl/dx86cl64 -b -l myscript 

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

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