2010-08-08 27 views
8

tôi thử như sau:Làm thế nào để chạy Clozure CL (Lisp) từ một kịch bản lệnh shell trên OS X?

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

$ ./args.sh 

Không thể tải hình ảnh đống lisp từ ./args.sh

tôi có thể chạy lisp phạt trực tiếp:

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

? 

Có thể viết một kịch bản để chạy mã lisp với Clozure CL? Tôi chắc chắn tôi đang làm điều gì đó ngớ ngẩn.

Tôi đã cài đặt nó từ: http://openmcl.clozure.com/

Trả lời

6

Chỉ cần theo dõi câu trả lời của Charlie Martin và câu hỏi tiếp theo của bạn. dx86cl64 --eval <code> sẽ kích hoạt REPL, vì vậy nếu bạn muốn kích hoạt tập lệnh đã cho rồi thoát, chỉ cần thêm đoạn mã này vào cuối tập lệnh: (ccl::quit). Trong ví dụ mà bạn cung cấp, điều này sẽ làm các trick:

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

Một kịch bản đẹp hơn sẽ là như sau:

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

Đặt rằng vào một tập tin, load-ccl-script.sh (hoặc tên khác của sự lựa chọn của bạn). Sau đó, tương tác sau hoạt động:

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

Cảm ơn! (Tôi đoán 'sh' là dư thừa trong 'sh load-ccl-script.sh a.lisp' ...) –

+0

Đúng, nhưng không có nó tôi đã phải bao gồm 'chmod + x load-ccl-script. sh' line - 3 ký tự ngắn gọn hơn một chút, và vì đây không phải là mục đích của đoạn mã tôi đã đi theo cách lười biếng :) – Edgar

0

Bạn phải chắc chắn rằng hạt nhân có thể tải một hình ảnh bộ nhớ Lisp. Hành vi mặc định là để hạt nhân tìm kiếm tệp, được đặt tên giống như nhị phân hạt nhân có ".image" được thêm vào, tức là, nếu bạn khởi động CCL bằng cách sử dụng dx86cl64, thì hình ảnh được tải là dx86cl64.image từ cùng một thư mục. Bạn có thể sửa đổi hành vi này bằng cách cung cấp hình ảnh explictely bằng cách sử dụng tùy chọn --image. Hãy thử dx86cl64 --help để biết thêm thông tin.

2

Vấn đề này là phù hợp công việc của bạn:

\#! /Applications/ccl/dx86cl64 

Trong một tập tin UNIX, 16 bit đầu tiên được gọi là "con số kỳ diệu". Nó xảy ra rằng số ma thuật cho một tập lệnh thực thi có cùng cấu hình bit với các ký tự "#!". 16 bit đầu tiên của tệp của bạn có cấu hình giống như "\ #" và UNIX sẽ không mua nó.

Có thể thêm số ma thuật, nhưng nó không phải là dễ dàng hoặc di động, vì vậy những gì bạn cần là một cách để gọi kịch bản. Tôi muốn đề xuất

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

với các đối số thích hợp, v.v. cho tập lệnh của bạn. (Các exec dựng sẵn làm cho quá trình hiện tại để được nạp với các tên thực thi mà không forking, do đó bạn không có một quá trình tùng nói dối về.)

Cập nhật

Trong trường hợp cụ thể của bạn , bạn sẽ muốn một cái gì đó như

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

Xem command line args for Clozure vì lý do.

+0

Cảm ơn đề xuất. Tôi đã thử điều này: #!/bin/bash exec/Applications/ccl/dx86cl64 --eval '(định dạng t "hello script")' Điều đó có tác dụng, ngoại trừ việc tôi nhận được lời nhắc sau khi phương thức thực thi. Làm cách nào để thoát khỏi vòng lặp? $ ./args.sh hello script Chào mừng bạn đến với Clozure Phiên bản Lisp thông thường 1.5-r13651 (DarwinX8664)! ? –

+0

(tạm biệt) Tôi tin. –

+1

Ít nhất cho đến khi Clozure 1.4 '(tạm biệt)' không có sẵn. '(ccl :: quit)', tuy nhiên, là (do đó '(quit)' cũng sẽ hoạt động nếu bạn đang ở trên gói 'ccl'). – Edgar

0

Xem thư mục con của tập lệnh trong thư mục ccl của bạn. Nó sẽ có một số kịch bản bạn có thể thích nghi và sử dụng.

+0

Tôi đã làm. Thật không may họ không phải là đoạn mã script lisp, nhưng tiện ích shell. –

0

Bạn không thể gọi kịch bản như thế này từ dòng lệnh:

/Applications/ccl/dx86cl64 myscript 

thể bạn?

Tôi nghĩ rằng bạn cần phải gọi nó như thế này (tôi không có Clozure CL ở đây, vì vậy tôi không thể kiểm tra):

/Applications/ccl/dx86cl64 -b -l myscript 

Vì vậy, kịch bản của bạn nên bắt đầu như thế này:

#!/Applications/ccl/dx86cl64 -b -l 
... 
Các vấn đề liên quan