Ubuntu 12.04でCommon Lispやるよ!の続きです。
今日はまずCaveman2でルーティングにアノテーション使ってみるよ。
その前に
myappおさらい
「(caveman2:make-project #P”~/commonlisp/myapp/” :author “yosiwo”)」でmyappプロジェクトのひな形を作ったよ。
「~/commonlisp/myapp」にプロジェクトができるので中を見ると下記のとおりだよ。
「web.lisp」が本体で、ここにルーティングといわゆるコントローラ部分を書いていくイメージですね。
$ cd ~/commonlisp/myapp
$ ls
app.lisp db myapp.asd myapp-test.asd README.markdown
shlyfile.lisp src static t templates
$ ls src/
config.lisp main.lisp view.lisp web.lisp
ここまでが昨日のおさらい。
Caveman2でアノテーションを使ってみる
公式ページではトップにデデンとアノテーションで書いたサンプルがのっているのでさくっと試してみたくなるのだけれど、Caveman2からCommon Lispに入るという特殊(?)な経緯だとはまった。
こういう事だった。
アノテーションが動かないと悩んでたけど(caveman2:make-project) で作られるプロジェクトが標準では(enable-annot-syntax)してないだけだった。次はDBアクセス試そう。
— yosiwo (@yosiwo) 2014, 2月 18
あ、あと、cl-annotのインストールも先に必要。
時の羅針盤@blog: quicklispのインストールからcl-annotまで
このサイトを見るまで右往左往してたんだけどこれ見てなるほど!
cl-annotをインストール
相変わらずワンライナー
$ echo '(ql:quickload "cl-annot")' | sbcl
cl-annotを使う
(:use)に:cl-annot追加して、(enable-annot-syntax)する。標準ではdefrouteでルーティングが定義されているところにアノテーションで /welcomeannot ルールを追加した。(文字色紫色部分)
$ vim src/web.lisp
(in-package :cl-user)
(defpackage myapp.web
(:use :cl
:caveman2
:caveman2.db
:myapp.config
:myapp.view
:cl-annot)
(:export :*web*))
(in-package :myapp.web)
(enable-annot-syntax)
;;
;; Application
(defclass () ())
(defparameter *web* (make-instance '))
;;
;; Routing rules
(defroute "/" ()
(with-layout (:title "Welcome to Caveman2")
(render #P"index.tmpl")))
(defroute "/welcome" (&key (|name| "Guest"))
(format nil "Welcome, ~A" |name|))
@route GET "/welcomeannot"
(lambda (&key (|name| "AnnotGuest"))
(format nil "Welcome, ~A, You are annot user!" |name|))
;;
;; Error pages
(defmethod on-exception ((app ) (code (eql 404)))
(declare (ignore app))
(merge-pathnames #P"_errors/404.html"
*template-directory*))
標準は5000番ポートを使うのだけど、何となく別ポートで動かしてみたかったのでポート変えて起動してみた。
(ql:quickload :myapp)
(myapp:start :port 8080)
http://localhost:8080/welcomeannot?name=hogehoge
にアクセスすると
「Welcome, hogehoge, You are annot user!」
と表示されるよ。やったね!センス無くてごめんね!
defroute で定義している「/」や、「/welcome」もそのまま動いた。併用問題なさそう。
次はDB周りをさわってみます!
Hi, great work.
What is the right way to test? I want to write unit-tests using db but use of :*.db package, :sxql or :datafly in :*-test package definition causes names import problems.