#asdfについて
ごきげんよう。今日はasdfについて説明していこうと思う。それにquicklispを使ったライブラリの作り方も説明していく。これを読んで、自分もライブラリを作ろうと思ってくれたら幸いだ。
asdfとは、commonlispのライブラリをインストールするときに使うライブラリでrubyのgemに近いものがある。つまり、複数のソースコードを一括でロードをすることができる。分割したぶつ切りのコードを統合してくれると思ってくれたほうがいいかもしれない。ただし、Pythonやgemのような使い勝手の良さはさほどない。というよりも全く無いに等しい。つまり、初心者には使い勝手が悪すぎる。
だが、今だけは我慢してほしい。いずれは、もっと使いやすいものが生まれてくるから。というのも、おそらくだが、いずれかはPythonのimportのようにimportするだけで使えるライブラリが出てくるかもしれません。日本のcommonlisperたちはとても勤勉です。roswellを作れたのだからきっとそういうのができます。だから今だけはasdfを使ったライブラリ製作をしてほしいと思っています。
前座が終わったところで、quicklispを使ったライブラリの製作を行っていこう。
#quicklispでのライブラリの使い方。
quicklispはご存知の通りインターネット上のライブラリをインストールしてくれるライブラリだ。だが、quicklispはオンラインだけではなく、ローカルでも機能する。すごいでしょ?ローカルで作れるのだから、誰でも作れるというわけだ。
それじゃあ、作り方を書きます。
まずはじめに、roswellをインストールしてください。
詳細はhttp://qiita.com/yuuki_robo/items/78e4a67d878728a0ad15 を参照してください。
そうすると
~/.roswell/local-projects
というファイルがあります。このlocal-projectの中に自分が作ったファイルを入れます。
cd ~/.roswell/local-projects
このコマンドを打ってください
そうすると、そこで
mkdir test
と書く。このtestの名前はなんでもいいです。名義上testとさせます。
そして、
ros run
をさせて、roswellを起動させます。
roswellを起動したら
(ql:quickload :cl-project) (cl-project:make-project #p"test")
と打ちます。#p"test"の""の中は書き出したいファイルを予め作っておいて、作ったファイル名を書き出します。
そうすると、
(ql:register-local-projects)
とroswell内で打ちます。間違ってもターミナルで打たないでください。そうすると、エラーが出ますので。
そうすると、
(ql:quickload "test")
すると、おそらくロードできる。
もし、できなかったら、こちらにご連絡してください。その都度修正や、アドバイスをいたします。
lisp.functions.math@gmail.com
#asdfのファイルについて。
ここまで来たら、asdfのファイルついて話します。
(in-package :cl-user)
(defpackage test-asd
(:use :cl :asdf))
(in-package :test-asd)
(defsystem test
:version "0.1"
:author ""
:license ""
:depends-on (:clack)
:components ((:module "src"
:components
((:file "test"))))
:description ""
:long-description
#.(with-open-file (stream (merge-pathnames
#p"README.markdown"
(or *load-pathname* *compile-file-pathname*))
:if-does-not-exist nil
:direction :input)
(when stream
(let ((seq (make-array (file-length stream)
:element-type 'character
:fill-pointer t)))
(setf (fill-pointer seq) (read-sequence seq stream))
seq)))
:in-order-to ((test-op (test-op test-test))))`
こんなファイルが生成されていると思う。これを一つずつたどっていけば少しでもcommonlispのことを理解できると思う。
では始めていこう。
まず、in-packageのことだが、これはパッケージという名前空間、つまりsqlでいうところのdatabaseに当たるところだ。この名前空間のなかで、ソースコードを打ちますという宣言になる。
次にdefpackageだが、これはdefpackageによって名前空間を生成しますという宣言だ。さっき言った通り、databaseと同じようにデータベースを生成している。そういう理解で合っていると思う。defpackageで生成したら、その名前空間を作ったことになる。その中の:useは使うパッケージを宣言してpackageに組み込むことを意味している。pythonのimportと同じかな。ただ、外部ファイルに生成をしたら自動的にできるものではないので、注意してほしい。
さて、defsystemの説明に入るが、defsystemはasdfでどのファイルをロードすればいいか、とかどのライブラリを参照すればいいのかとかをわかるようにしているものである。
:versionはそのライブラリのバージョンを意味している。
:authorは著作者を示している
:licenceはGPLとかMITとかのライセンスを表している。
:depends-onは外部ライブラリを表している。これはquicklispでロードしたものを使っても良い例えば(:clack)はclackというライブラリを使っている。このようにして外部ライブラリとも密接に関われるのがdepends-onの役割だ。
:compnentsはどのソースコードを読み込むかを設定する。この場合:moduleはロードするファイルで、:compnentsはソースコードを表している。:fileは読み込むソースコードを設定します。
desriptionはアプリケーションの概要の説明書きです。
with-open-fileでは、READMEという説明書きを読み込むことができます。
:in-order-toはおそらくテストファイルを読み込んでいると思います。
おそらく、これでasdfのファイルの説明は終了だ。
次に書くのはcavemanというcommonlispのウェブフレームワークについて書こうと思う。軽量だから読みやすいと思うしね。