2010-08-08 122 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 
...