#はじめに
##作者のレベル
まだ、Land of Lispと実践Common Lispを読み、これからCommon Lispを始めようとしているレベルです。なので、全然詳しくないです。
##なぜこの記事を書こうと思ったか
Common Lispをいざ始めてみようとして、いきなりつまづいたのがここでした。
Common Lispにはいろんな処理系があって、参考となる情報も少なく、この通りにやればCommon Lispはできるよというような情報がなかなか見つかりません。
他のメジャーな言語では、スクリプトを実行するという当たり前のようなことすら、どういうやり方が正しいのか分からないというのが、Common Lispの楽しさなのかもしれません。。
##試している環境
macOS Mojave version 10.14.6
roswell 21.10.14.111(NO-GIT-REVISION)
処理系 sbcl
#実行方法
##buildする方法
この方法を実行すると、roswellが入っていない他の環境(同一のOSに限る)でもプログラムを実行することができます。
まずはプロジェクトのスケルトンを作成します。
$ ros run
* (ql:quickload :cl-project)
To load "cl-project":
Load 1 ASDF system:
cl-project
; Loading "cl-project"
..
(:CL-PROJECT)
* (cl-project:make-project #P"hello" :author "aaa")
次に作成されたsrcディレクトリ内にあるmain.lispにコードを書きます。
変更前
(defpackage hello
(:use :cl))
(in-package :hello)
;; blah blah blah.
変更後
(defpackage hello
(:use :cl)
(:export :wow))
(in-package :hello)
(defun wow ()
(print "hello!"))
次にrosファイルを作成します。
スケルトンを作成したカレントディレクトリで実行します。srcディレクトリの一つ上です。
$ ros init hello
Successfully generated: hello.ros
作成された hello.ros ファイルを編集します。
変更前
#!/bin/sh
#|-*- mode:lisp -*-|#
#|
exec ros -Q -- $0 "$@"
|#
(progn ;;init forms
(ros:ensure-asdf)
#+quicklisp(ql:quickload '() :silent t)
)
(defpackage :ros.script.hello.3846270491
(:use :cl))
(in-package :ros.script.hello.3846270491)
(defun main (&rest argv)
(declare (ignorable argv)))
;;; vim: set ft=lisp lisp:
変更後
#!/bin/sh
#|-*- mode:lisp -*-|#
#|
exec ros -Q -S . -- $0 "$@"
|#
(progn ;;init forms
(ros:ensure-asdf)
#+quicklisp(ql:quickload '(:hello) :silent t)
)
(defpackage :ros.script.hello.3846270491
(:use :cl))
(in-package :ros.script.hello.3846270491)
(defun main (&rest argv)
(declare (ignorable argv))
(hello:wow)
)
;;; vim: set ft=lisp lisp:
-S . と追加しておりますが、このコマンドラインオプションは、SourceRegistryの指定となります。
~/common-lispなど、ASDFがソースを探せるディレクトリにスケルトンを作成する場合は必要ありません。
まり、~/common-lisp内にある他のプロシェクトを参照する場合は、-S . を指定しないでください。
他のプロジェクトを探せなくなります。
この状態で、rosファイルをそのまま実行することもできますが、このままコンパイルします。
$ ros build hello.ros
WARNING: :SB-EVAL is no longer present in *FEATURES*
compressed 0 bytes into 8 at level -1
compressed 32768 bytes into 279 at level -1
compressed 27033600 bytes into 6426090 at level -1
compressed 1998848 bytes into 569613 at level -1
compressed 11730944 bytes into 3813223 at level -1
これで hello という実行ファイルができていますので、実行してみます。
$ ./hello
"hello!"
##roswellからスクリプトを起動する方法
これが意外と情報がなかったんですが、main関数さえ作ってしまえば、直接roswellからスクリプトを実行できました。
(defun main ()
(print "hello!"))
これだけです。
実行してみます。
$ ros hello.lisp
"hello!"
すごく簡単です。
#参考URL
https://kitemw.hateblo.jp/entry/2018/05/15/113058
https://kitemw.hateblo.jp/entry/2018/05/16/130856
https://kitemw.hateblo.jp/entry/2018/05/17/132841
https://blog.3qe.us/entry/2017/12/12/163000