RoswellでLisp環境を

Roswell事件 LISP
Roswell事件

Lisp言語でプログラミングする環境を調べていたが、プロジェクト管理の実際がうまく理解できていまない。プログラム言語でプログラムを書くにも、開発を支える環境というものがないと、大変な労力を必要とする。定番の手順で管理できるに越したことはない。

で、見つけたのがRoswellだ。これが最近出たものらしい。GitHubに登録されていて、MITライセンスだ。最初のコミットから10年経っているので、成熟度は良い(失礼!)と見た。

RoswellのREADMEから翻訳して引用

RoswellーCommon Lisp環境設定ユーティリティ

Roswell は、Lisp 実装インストーラー/マネージャー、ランチャーなどです。

Roswell は、Common Lisp 実装のインストールと管理を非常にシンプルかつ簡単にすることを目的としたコマンドライン ツールとして始まりました。

Roswell は現在、Common Lisp 開発用のフルスタック環境に進化しており、Lisp アプリケーションのテスト、共有、配布を容易にする多くの機能を備えています。Roswell とともに、私たちは Common Lisp コミュニティの生産性をまったく新しいレベルに押し上げることを目指しています。

ロズウェルはまだベータ版です。それにもかかわらず、基本的なインターフェイスは安定しており、変更される可能性はほとんどありません。Roswell は現在、Linux、macOS、FreeBSD などの Unix 系プラットフォームでうまく動作します。Roswell は他のオペレーティング システムでも動作しますが、現時点では一部の部品や機能が欠落しているか不安定である可能性があります。

Roswellの謂れをNaming Origin ‘roswell’から翻訳引用

エイリアンの秘密技術で作られた」より。

私は、人々が Lisp を使いやすくすることは、人類が異星人のテクノロジーと交わる機会を作るようなものだと感じました。概念としては「ロズウェル事件」を思い出します。あなたがどう感じているかわかりません。

Roswell導入ログ

取り敢えず素のLispは削除

aptで入れていたパッケージは全て削除した。これはRoswell配下にインストールし管理できるためである。影響ないとは言われているが、やはりそこは僕だから何やるかわからん。原因は1個のほうが良かろう。

sudo apt remove clisp
sudo apt remove sbcl

Roswellを入れる

久しぶりにソースからの導入をやってみた。緊張するなあ。

git clone -b release https://github.com/roswell/roswell.git
cd roswell
sh bootstrap
./configure --prefix=$HOME/.local
make
make install
echo 'PATH=$HOME/.local/bin:$PATH' >> ~/.profile
PATH=$HOME/.local/bin:$PATH ros setup

gitとか必要なものはあったみたいで、無事に入いった。ここでRoswellの環境を初期化するには。

ros

と入れるだけで下記のようになる。

ros config
setup.time=3919902105
sbcl-bin.version=2.4.2
default.lisp=sbcl-bin

このようにsbcl(Common Lispの実装)がインストールされる。

Roswellの詳細はmanコマンドにまかせて、プロジェクトを作ってみた。

my1stproを作ってみた

実際に開発するに当たってはこの辺をしっかりと意識しないといけない。
Lispの動作を勉強するのとは違うところだ。

作業場所は.roswell/local-projects配下

この場所でないと自分で作ったパッケージやらが見つからないことになってしまうらしいぞ。

$ cd .roswell/local-projects
ros run
* (ql:quickload :cl-project)
To load "cl-project":
  Load 6 ASDF systems:
    alexandria asdf cl-ppcre let-plus local-time uiop
  Install 6 Quicklisp releases:
    cl-ansi-text cl-colors cl-colors2 cl-emb cl-project
    prove
ー省略ー
* (cl-project:make-project #P"my1stpro" :author "tsukasa")
writing my1stpro/my1stpro.asd
writing my1stpro/README.org
writing my1stpro/README.markdown
writing my1stpro/.gitignore
writing my1stpro/src/main.lisp
writing my1stpro/tests/main.lisp
T
* (quit)

プロジェクト用のライブラリを呼んで、プロジェクト名とオーサー名を指定した。
これで下記が出来ている。

$ tree ./my1stpro
├── README.markdown
├── README.org
├── my1stpro.asd
├── src
│   └── main.lisp
└── tests
    └── main.lisp
2 directories, 5 files

README.markdownにはプロジェクトの概要をマークダウン記法で書く。
README.orgにはテキスト形式で書く。
my1stpro.asdにはASDFビルドツールの制御内容が書かれている。
src/main.lispにはmainルーチンの雛形が書かれている。
tests/main.listにはテストのmainルーチンの雛形が書かれている。

起動用スクリプトを用意する

ユーザーインタフェイスのためにsr/main.lispから手を入れていくことになるだろう。
がしかし、その前にやることが。
このプロジェクトを起動するためのスクリプトがいるのだ。

$ ros init my1stpro
Successfully generated: my1stpro.ros
$ tree
.
├── README.markdown
├── README.org
├── my1stpro.asd
├── my1stpro.ros
├── src
│   └── main.lisp
└── tests
    └── main.lisp

Roswellのinitサブコマンドでスクリプトの雛形を作成する。
my1stpro.rosがそれ。実行可能ファイルである。
指定したプロジェクト名でディレクトリを判断してくれるが要注意だな。

起動スクリプトを動かしてみる

この起動スクリプト(rosファイル)を動かして見よう。
動作が分かるように、若干手を入れてみる。

#!/bin/sh
#|-*- mode:lisp -*-|#
#|
exec ros -Q -- $0 "$@"
|#
(progn ;;init forms
  (ros:ensure-asdf)
  #+quicklisp(ql:quickload '() :silent t)
  )

(defpackage :ros.script.my1stpro.3920086751
  (:use :cl))
(in-package :ros.script.my1stpro.3920086751)

(defun main (&rest argv)
  (declare (ignorable argv))
  (write-line "Hello World!")
  (print "Hello World!")
)
;;; vim: set ft=lisp lisp:

赤の行を追加してみた。その実行例は下記。

tsukasa@ark:$ ros ./my1stpro.ros
Hello World!

"Hello World!" tsukasa@ark:$ 

tsukasa@ark:$ ./my1stpro.ros
Hello World!

"Hello World!" tsukasa@ark:$ 

ご覧のようにrosを使わなくても起動できることが分かると思う。

main.lispを起動してみる

次にsrc/main.lispに手を入れてみよう。現実の開発に即した手順だ。

(defpackage my1stpro  ;パッケージの定義
  (:use :cl)
  (:export :echo-hello-world)  ;関数をexport
)
(in-package :my1stpro)  ;パッケージ名を指定

(defun echo-hello-world ()  ;関数定義
  (write-line "my1stpro/src/main.lisp !"))
;; blah blah blah.

雛形をこのように変更した。echo-hello-world関数を定義してexportしている。
更にrosファイルにも手を入れる。

#!/bin/sh
#|-*- mode:lisp -*-|#
#|
exec ros -Q -- $0 "$@"
|#
(progn ;;init forms
  (ros:ensure-asdf)
  #+quicklisp(ql:quickload '(:my1stpro) :silent t)
)

(defpackage :ros.script.my1stpro.3920086751
  (:use :cl)
)

(in-package :ros.script.my1stpro.3920086751)
(defun main (&rest argv)
  (declare (ignorable argv))
  ; main loop is here
  ;(write-line "Hello World!")
  ;(print "Hello World!")
  (my1stpro:echo-hello-world) ;関数呼び出し
  0 ; end status
)
;;; vim: set ft=lisp lisp:

最初のトライアルを消してecho-hello-world関数を呼び出している。
戻り値は0だ。
この変更は通常の加初の形式になっている。
そして実行してみよう。

$ ./my1stpro.ros
my1stpro/src/main.lisp !

動いて最初のときとは違う文字列が出力された。

後はより深く使っていくだけ

取り敢えずプロジェクトを初期化することは出来た。後の手順は色々とあるだろうが、当たっていくしか無い。

実際のソースを勉強させてもらうのが速いかな。

コメント

タイトルとURLをコピーしました