僕がアリエルに入ってから、今月で一年が経ちました。通常一年の振り返りは大晦日にすれば十分なものですが、アリエルの年度末ついでに振り返っておきます。
僕はこの一年間、かつてないほどプログラムを書きました。短期間のうちに次々とプロダクトを生み出したために、不幸にも十分に紹介しきれていないプロダクトもあります。それもいずれModern Common Lispに書こうと考えていたのですが、見ての通りその筆も遅々としているのでここで紹介しておきます。
L5 (2010年5月)
L5はアリエルに入ってすぐに作ったS式で記述するプレゼンツールです。Clojureで書かれています。Web+DB Press Vol.61ではこれに言及した記事を書かせていただきました。
アリエルに入りたての頃、井上さんに声をかけられて、社内でClojure勉強会をすることになったのが発端です。アリエルの面接を受けたとき、最近はClojureをやっている、という話をしたためでしょうか、アリエルに入ってしばらくは”Clojureをやる人”という認識をされていたように思います。
けれど、そのときまでにClojureで書いたものといえばAppEngine上で動くTwitterボット程度のものです。発表するなら事前に何か作っておきたいなぁと思ったときに考えたのがプレゼンツールでした。社内勉強会をした段階ではようやく見れる程度のものにすぎなかったものをGitHubでL5という名前で公開し、Tokyo.cljでちまちまと作りつづけ、なんとか今の形にまでなったものです。
作り始めた理由が理由だけに、自分で使うことを開発の主目的でした。この一年、Shibuya.lisp、ありえるえりあ勉強会で発表しましたが、いずれもL5を使って資料を作ってきました。けれども最近になって、使ってくれた人の声もちらほら聞くこともあってうれしい限りです。
この程度のプロダクトに裏話など不要でしょうが、L5は最初はScarecrowという名前でした。 L5になった理由は言うまでもなくS5由来です。
CL-TEST-MORE (2010年10月)
再びCommon Lispに戻ってきた理由は今でははっきりしません。推測するに、おそらくJavaが嫌いだったのでしょう。副作用がないというフレコミのClojureも、Javaのライブラリを使いすぎると手続き的です。
Common Lispに戻ってきて最初に作ったのがCL-TEST-MOREというテストライブラリでした。初めて一人で渡米し、ILC2010 @ Renoから意気揚々と帰国した次の日のこと、Shibuya.lisp Hackason #1でだらだらと作り上げたものです。
このときの僕のCLのレベルは今思えばひどいもので、コードを見れば思わず苦笑するほどですが、最初に作ったCLライブラリということもあり、僕には愛着のあるものです。Quicklispに登録されたというだけで無邪気に喜んでいたくらいですから。
もちろん、あとで作った僕のプロダクトはすべてこのCL-TEST-MOREでテストされています。
cl-markup (2010年12月)
今こうして並べてみると、このプロダクトだけは他から浮いてみえます。理由の一つは、これが僕の必要から生まれなかったからでしょう。
この時期、アリエルで松山さんがCommon LispでWebサービスを作ることになりました。それに辺り、松山さんはCLにまともなテンプレートエンジンがないことを嘆いていました。最も有名なのはご存知CL-WHOですが、驚くべきことにCL-WHOは埋め込んだ文字を自動でHTMLエスケープしてくれないのです。これはCL-WHOの造りに由来するところであり、マクロ展開時のぎりぎりのチューニングの結果生み出されていた歪みでした。
cl-markupはそんな松山さんの嘆きに応えるために僕が作ったテンプレートエンジンです。CL-WHOのようにHTMLをS式で記述できる上に、より簡潔で美しいAPIを提供しています。そして、CL-WHOと遜色ないほどのチューニングを施してあります。ほとんどの静的記述はコンパイル時にwrite-stringにまで展開されます。
その仕組みから、複雑なテンプレートを書くとコンパイルに時間がかかるという欠点があります。この欠点はSBCLで最も顕著になり、僕や松山さんがCCLに移行する発端となりました。
cl-markupがQuicklispに登録されるまではそれほど時間はありませんでしたが、その後は今に至るまでブログやTwitterなどでまったく触れられることがなかったかわいそうなプロダクトです。理由は、これが完成してすぐ、僕はClackの開発に取りかかったからです。
Clack (2011年1月)
Clackは今見返しても僕が生み出した最大の作品です。言い過ぎではないでしょう、これほど美しいCLプログラムを僕は見たことがありません。そして、この美しいプログラムが存在しなければ、のちに松山さんが作ったcl-annotも生まれ得なかったのではないかと思います。
実を言うと、僕が最初に作ろうとしていたものはRailsでした。フレームワークの名前もSlinkyという名前でした。リポジトリを遡ればdefactionやdefviewといったありきたりな名前のマクロが作られていた痕跡も見つかります。そんなSlinkyは元旦を越えた頃、野暮なコードの大部分を捨て去り、Clackへと生まれ変わったのです。
ClackはPerlのPlackを参考に作られました。Plackと自分のコードを見比べて感じたことは、Common Lispのコードが他の言語の進化と調和していないことでした。最近のLLでは当たり前のようにプログラムの各コンポーネントの非依存化が進んでいます。疎結合は密結合より良しとされ、保守性もあがることは常識となっています。もちろんPerlでもそうです。
しかし、Common Lispプログラムではパッケージをコンポーネントごとに分けるということすらされていません。パッケージが分かれていたとしてもいたずらにuse-packageする慣習から、そのシンボルがどこで生まれたものなのかも判別することが難しい状態です。
そういったCommon Lispの醜い部分がどうすれば美しくなるか。どうすればコードがドキュメントになりうるのか。それを考え抜き、作っては大胆に壊すことを惜しげなく繰り替えして、6週間の苦悩の末完成に至ったのです。ドキュメントと自動テストも、あとから追加すればいい、などと妥協しなかったのも自信が持てる点です。
Clackの偉大な点は、その実用性に止まりません。ClackはCommon Lisp界の新しい道を規程する象徴であり、それを辿る旅がModern Common Lispです。
Caveman (2011年2月)
世に出たClackには、明らかにそれを使ったフレームワークの存在が不可欠でした。しかし、Clackが僕のブログで十分な反響を得たあと、途端に静かになるのを僕は見逃しませんでした。そのとき僕がしなければならないことは、誰かがClackを利用したフレームワークを作ることを期待する前に自分自身でCommon LispのWebフレームワークを作ることです。
CavemanはCommon Lisp界のSinatraです。ディスパッチャ部分はFlaskに似ています。もちろんModelやViewに関して何も強制するものはありません。
まとめ
手嶋屋にいる頃から僕は、「そろそろ知識を蓄えてばかりではいけない。何かを生み出さないと」という考えに言いようもない焦りを感じていました。常にそれを念頭に置いていたわけではないにせよ、こうして振り返った限りではそれを実現はできているようにも思えます。
ただ、作るものに偏りがあるのも確かです。多くのWebサービスを生み出している人々と比べれば、ライブラリをいくつか書いた程度では比較にならないかもしれません。Lispが実用的なものを何一つ生み出していないなどとほざいている人には相手にもされないでしょう。
そうすると、次の課題は今作った地盤を固めてさらに上を目指すことになるんでしょうか。あんまり地道な道のりは得意ではないけど、Lispでお金が生まれる日まではプログラミングに対するセンス・オブ・ワンダーを忘れないようにしよう。




コメントする