八発白中

技術ブログ、改め雑記

Day 3: Caveman

これは fukamachi products advent calendar 2016 の3日目の記事です。

今日はCavemanについて話します。

Clackに対するコメント

Clack のリリースエントリは僕にとってはかなりの反響がありました。

その当時の記事についたはてなブックマークコメントで面白いものがあるので紹介します。

f:id:nitro_idiot:20161202224033p:plain

この id:kdaiba さんのコメントは全く的を射ていて、賞賛でもなく批判でもありません。そして僕自身もClackがゴールだとは微塵も思っていませんでした。

Webフレームワーク

次に必要なのはWebフレームワークです。Clackを直接使うこともできましたが、やはりどのアプリケーションにも共通の部分というのはあります。たとえばURLディスパッチャ。それからテンプレートエンジンとの連携。環境による設定の切り替えなどがそうです。

僕はすぐにWebフレームワークの開発に取り掛かり、Clackのリリースからちょうど1ヶ月後にリリースしました。名前は「Caveman」です。

この名前に特に面白い由来があるわけではありません。Clackとは異なり何かユニーク性の高い名前をつけたいと思って m2ym さんと話しており、「かわいい名前よりも強そうな名前にしよう」という方向性だけ決まったのち、ふっと頭にこの名前がよぎったためにつけられました。

俗に言うマイクロWebフレームワークで、Sinatraのようなものと同等の機能を備えていました。アーキテクチャの参考にしたのはPerlAmon2です。ここでも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を推奨していたかは以下のエントリに詳しく書きました。

blog.8arrow.org

RESTAS

同時期に作られたWebフレームワークがあります。そのRESTASというフレームワークは、軽量であることは共通ですが、ClackではなくHunchentootをベースとして作られていることが違います。

面白く思ったのが、作者のarchimagも同時期にバックエンドサーバーに依存しないレイヤーの必要性をHunchentootのメーリングリストに投稿していたことです。しかし彼が想定していたのはHunchentootと同じ比較的リッチなAPIを提供するものであり、RESTASがClackを使うことはありませんでした。

作者がロシア在住であることもあり、RESTASはEUのコミュニティである程度受け入れられていたように見えます。CLikiはRESTASで作られていますし、まともな実績のないCavemanよりはユーザーはいたのではないでしょうか。

Caveman2

それから2年後。Cavemanはフルスクラッチで書き直され、「Caveman2」としてリリースされました。

blog.8arrow.org

機能が増えてマイクロWebフレームワークからスモールWebフレームワーク程度になりました。現在、Common Lispでデータベースと連携する機能が標準でついている唯一のWebフレームワークです。

「THE REAL FRAMEWORK」という売り文句で強気ですが、まったく冗談のつもりはありません。Common LispでWebアプリケーションを作ろうと思うなら現状唯一と言えるほどの存在だと思います。

おわりに

CavemanはGitHubで公開されており、現在Starは388です。

明日のアドベントカレンダーは4日目のcl-projectについてです。お楽しみに。