Day 3: Caveman
これは fukamachi products advent calendar 2016 の3日目の記事です。
今日はCavemanについて話します。
Clackに対するコメント
Clack のリリースエントリは僕にとってはかなりの反響がありました。
その当時の記事についたはてなブックマークコメントで面白いものがあるので紹介します。
この id:kdaiba さんのコメントは全く的を射ていて、賞賛でもなく批判でもありません。そして僕自身もClackがゴールだとは微塵も思っていませんでした。
Webフレームワーク
次に必要なのはWebフレームワークです。Clackを直接使うこともできましたが、やはりどのアプリケーションにも共通の部分というのはあります。たとえばURLディスパッチャ。それからテンプレートエンジンとの連携。環境による設定の切り替えなどがそうです。
僕はすぐにWebフレームワークの開発に取り掛かり、Clackのリリースからちょうど1ヶ月後にリリースしました。名前は「Caveman」です。
この名前に特に面白い由来があるわけではありません。Clackとは異なり何かユニーク性の高い名前をつけたいと思って m2ym さんと話しており、「かわいい名前よりも強そうな名前にしよう」という方向性だけ決まったのち、ふっと頭にこの名前がよぎったためにつけられました。
俗に言うマイクロWebフレームワークで、Sinatraのようなものと同等の機能を備えていました。アーキテクチャの参考にしたのはPerlのAmon2です。ここでもPerlコミュニティからの影響を受けています。
アノテーション記法
Cavemanの目新しく特筆すべき点は、Common LispでアノテーションをAPIとしてユーザーに提供した初めてのプロダクトというところでしょう。
@url GET "/hi" (defun say-hi (params) "Hello, World!")
@url
の行に注目してください。
Lispというと括弧ですべてプログラムを構成するような印象を持っている方がほとんどだと思いますが、このコードでは@url
という宣言があります。
Common Lispにはリーダーマクロという自由に構文を定義する機能があり、この@url
という部分はcl-annotというアノテーションライブラリを使って定義しているのです。
昨日のClackの記事で、「Clackは思想的」と言いました。それは疎結合と再利用性に留まらず、Common Lispの新しい書き方も推進しようという意欲的なものであり、その一つがこのアノテーション記法でした。ゆえに僕のその以後のプロダクトの多くは必要以上と言えるほどにcl-annotを使って書かれています。
このCavemanの、アノテーションによるURLディスパッチャは評価のわかれるものでした。好きな人はこの記法があるためにCavemanを好んで使い、そうでない人は顔をしかめました。
4chanに「そんなに好きならPythonを使ってろよ」という書き込みがあったことを覚えています。面白い意見です。Lisperは普段から「括弧が多いという見た目など表面上の問題だ」と言ってシンタックスのある言語を批判しますが、そのLisperがアノテーションを表面でしか見ずに批判するのは皮肉なものです。
なぜ僕がcl-annotを推奨していたかは以下のエントリに詳しく書きました。
RESTAS
同時期に作られたWebフレームワークがあります。そのRESTASというフレームワークは、軽量であることは共通ですが、ClackではなくHunchentootをベースとして作られていることが違います。
面白く思ったのが、作者のarchimagも同時期にバックエンドサーバーに依存しないレイヤーの必要性をHunchentootのメーリングリストに投稿していたことです。しかし彼が想定していたのはHunchentootと同じ比較的リッチなAPIを提供するものであり、RESTASがClackを使うことはありませんでした。
作者がロシア在住であることもあり、RESTASはEUのコミュニティである程度受け入れられていたように見えます。CLikiはRESTASで作られていますし、まともな実績のないCavemanよりはユーザーはいたのではないでしょうか。
Caveman2
それから2年後。Cavemanはフルスクラッチで書き直され、「Caveman2」としてリリースされました。
機能が増えてマイクロWebフレームワークからスモールWebフレームワーク程度になりました。現在、Common Lispでデータベースと連携する機能が標準でついている唯一のWebフレームワークです。
「THE REAL FRAMEWORK」という売り文句で強気ですが、まったく冗談のつもりはありません。Common LispでWebアプリケーションを作ろうと思うなら現状唯一と言えるほどの存在だと思います。
おわりに
CavemanはGitHubで公開されており、現在Starは388です。
明日のアドベントカレンダーは4日目のcl-projectについてです。お楽しみに。