※まだ操れてません
前から気になっていたものの、なかなか手が伸びなかったLispに挑戦してみようと思い立ち、備忘のためにもここに勉強したことのログを残していくことにします。
せっかくだし、なんかしらのWebアプリが書きたいな...ということで、Caveman2のプロジェクトを作ってみて、その構成要素が何なのかを紐解いていこうと思います。
はじめに
これを書いてる人間のレベル。
- Lisp => 初心者。CLISPとGauche、Schemeを少々やってた
- パッケージ管理のシステム => 知らない
- SLIME => 名前はわかる、でもよくわからん
- ASDF => なにそれ
- QuickLisp => わからないなりに使ってる
- Roswell => 便利ぽいことはわかった。でもQLとはどういう関係?
- SxQL => 触ったことない
- ningle => 同上
- CL-DBI => 同上
- Clack => 同上
- その他
- Clojure + Leningenをちょっとだけ触った
- コード書く用事がある時はほぼほぼPython、Djangoは一応わかる
ご覧の通り初心者です。完全に「ハッカーと画家」に影響受けただけの人です。
Lisp自体はドキュメント見ながら一応コードは読めるものの、正直HyperSpecと真っ向からにらめっこするのはしんどい。Lispを取り巻くパッケージ管理とか開発環境については全く不勉強。
環境構築
ローカル環境を汚すのはあまり気が進まないので、コンテナ上で色々やってみることに。
こちらの記事を参考に、Roswellまでインストールした状態のイメージを作成し、基本コンテナ上でREPLを起動して作業。
復習
昔、学校での演習レベルでちょっと触ったことがあるので、手頃なソースを見ながら復習します。
Land of Lispのサンプルコードと思しき一覧を見つたので、webserver.lispをドキュメント見つつ、REPLでトレースしつつ、読み解きました。この辺で基本的な制御構造の復旧をしつつ、ストリームの使い方をぼんやり思い出します。やっぱり手続き型とは書き方の流儀がだいぶ違います。再帰の力。
Caveman2
とりあえずプロジェクトを作成してみる。
(caveman2:make-project #P"myapp"
:author "hassaku63")
;-> writing /path/to/myapp/.gitignore
; writing /path/to/myapp/README.markdown
; writing /path/to/myapp/app.lisp
; writing /path/to/myapp/db/schema.sql
; writing /path/to/myapp/shlyfile.lisp
; writing /path/to/myapp/myapp-test.asd
; writing /path/to/myapp/myapp.asd
; writing /path/to/myapp/src/config.lisp
; writing /path/to/myapp/src/db.lisp
; writing /path/to/myapp/src/main.lisp
; writing /path/to/myapp/src/view.lisp
; writing /path/to/myapp/src/web.lisp
; writing /path/to/myapp/static/css/main.css
; writing /path/to/myapp/t/myapp.lisp
; writing /path/to/myapp/templates/_errors/404.html
; writing /path/to/myapp/templates/index.tmpl
; writing /path/to/myapp/templates/layout/default.tmpl
プロジェクト配下のファイルを眺めてみます。
app.lisp
(これから調査)
myapp.asd
ASDFというのがあるらしいとは知りつつも、中身の書き方とかは一切知りません。
当面そこまでガッツリ知ることもないとは思いますが、ASDF(とasdファイル)の概要と、書いてある内容くらいはある程度の理解を持ちたい。とりあえずソースを眺めます
(in-package :cl-user)
(defpackage myapp-asd
(:use :cl :asdf))
(in-package :myapp-asd)
;...続く
ざっと見た感じではClojureのLeiningenとほぼほぼ変わらない感じ。
in-package がよくわからんかったのでググった。今は特定のパッケージが持っている名前空間に入るイメージという理解です。
cl-user の名前は、 HyperSpecによれば標準パッケージの名前空間とのこと。
index.tmpl
いかにもテンプレートファイルっぽいのがあるのでそれを眺めてみる。
djulaというテンプレートエンジンをデフォルトで採用しているとのこと。
Djula is a port of Python's Django template engine to Common Lisp.
とあるので、Djangoのテンプレートと近い感覚で使えるようです。ありがたい。
forループとfilterを駆使していく感じ。
myapp/*.lisp
全部これから調査。
おわりに
(2016/12/11)
随時追記していく予定。
assoc とかすごく見覚えがあるんだけど思い出せない。
(xyzzy)[http://www.geocities.jp/m_hiroi/xyzzy_lisp/abclisp08.html]さんのページを見て勉強する。