Common Lispのプログラムを実行する方法について説明します。
CLISPやSteel Bank Common Lispはシバン(シェバン、シェバングとも)に対応しています。UNIXに準じる環境では、Common Lispのソースコードに実行権限を付けて、ファイルの最初の行にシバンを書いておけば、シェルから直接実行することができます。
% cat hello #!/usr/local/bin/sbcl --script (format t "Hello, world.~%") % chmod +x hello % ./hello Hello, world. %
それ以外のシバンに対応していない処理系では、処理系がシバンを正しく扱えません。シェルが処理系を起動し、最初の行のシバンを読み込んだ時点でエラーになります。これを回避するには、リーダーマクロを定義してシバンを無視させると良いでしょう。
;; http://trac.clozure.com/ccl/ticket/823より (set-dispatch-macro-character #\# #\! (lambda (stream char n) (declare (ignore char n)) ;; 単純に改行まで読み飛ばす (do* ((ch (read-char stream nil nil) (read-char stream nil nil))) ((or (null ch) (eql ch #\newline)) (values)))))
このようなマクロを処理系の初期化ファイルに書いておけば、ソースコードをスクリプトとして実行できます。
% cd % cat .ccl-init.lisp (set-dispatch-macro-character #\# #\! (lambda (stream char n) (declare (ignore char n)) (do* ((ch (read-char stream nil nil) (read-char stream nil nil))) ((or (null ch) (eql ch #\newline)) (values))))) % cat hello #!/opt/ccl-1.6/lx86cl64 -l ;; シンボリックリンクを指定できないのでバイナリを直接指定 (format t "Hello, world.~%") ;; プログラムを終了させないとREPLに入る (quit) % chmod +x hello % ./hello Hello, world. %
多くの処理系では、トップレベルの処理の代わりに、あるいはトップレベルの処理の前にコードを実行できるようになっています。
% cat hello.lisp (format t "Hello, world.") % ccl -e '(progn (compile-file "hello") (quit))' % ls hello.* hello.lisp hello.wx32fsl % ccl -l hello -e "(quit)" Hello, world. % clisp -q -x '(progn (compile-file "hello") (quit))' ;; Compiling file C:\Cygwin\tmp\hello.lisp ... ;; Wrote file C:\Cygwin\tmp\hello.fas 0 errors, 0 warnings % ls hello.* hello.fas hello.lib hello.lisp hello.wx32fsl % clisp hello Hello, world. %
プログラム専用のイメージを作り、それを使って処理系を起動しても良いでしょう。
% cat main.lisp (defun main () (format t "Hello, world.")) % ccl Welcome to Clozure Common Lisp Version 1.7-r14925M (WindowsX8632)! ? (compile-file "main") #P"C:/Cygwin/tmp/main.wx32fsl" NIL NIL ? (load "main") #P"C:/Cygwin/tmp/main.wx32fsl" ? (ccl:save-application "main.image" :toplevel-function #'main) % ccl main.image Hello, world. %
コマンドラインパラメータやイメージの作り方については、それぞれの処理系のマニュアルを見てください。
実行ファイルを作れば、それぞれのOSごとに決められている方法でプログラムを自然に起動できます。あらかじめ処理系をインストールしておく必要もありません。
詳しくは処理系:実行ファイルの作り方を見てください。