How IT Works

プログラマーやっています。技術よりも人間学的なところが好きです。

Lispを1か月勉強して

動機

 巷ではLispは「神の言語」と呼ばれていると聞いて、興味を持ったのが始まりです。

 具体的に調べてみると、マクロと呼ばれる「コードを生成するコード」をかけるという話でした。

 業務ではC#やTypeScriptといった静的な言語を扱うことが多いのですが、個人的にはJavaScriptのダイナミックな動きが好きだったので、Lispはその延長線上にあるような予感がしました。

 あとは今はやりの関数型言語に分類されることが多いので、そこらへんの思考を盗めるとよいコードを書くことにつながるのではないかともくろみました。

 そういうわけで、死ぬ前に一度は触ってみようと思い、勉強を始めました。

勉強方法

 Lispを書くにはEmacsがいいということだったのですが、今のところ自宅のPCはWindowsなので手軽にできるxyzzyでやることにしました。

xyzzy - カスタマイズ可能で軽快な Windows 用テキストエディタ

 まずは、下のページを写経することから始めました。基本的にscratchで書いて、C-jでコンパイルして、評価するだけです。

www.geocities.jp

 慣れてきたら、くじ引きとかボウリングとか適当な課題を作って遊んだり、Git Hubの適当な問題を解いて遊んでいました。

github.com

 書籍は色々買いましたが、以下の4冊がなかなかいいなと思います。

 上2つはLispの概要で、下2つはマクロの使い方です。特にマクロについては使い方が難しいので、書籍があることが大きな助けになっています。

Land of Lisp
Land of Lisp
posted with amazlet at 17.10.25
M.D. ConradBarski
オライリージャパン
売り上げランキング: 184,763
実践Common Lisp
実践Common Lisp
posted with amazlet at 17.10.25
Peter Seibel
オーム社
売り上げランキング: 201,222
On Lisp
On Lisp
posted with amazlet at 17.10.25
ポール グレアム 野田 開
オーム社
売り上げランキング: 196,799
LET OVER LAMBDA―Edition 1.0
LET OVER LAMBDA―Edition 1.0
posted with amazlet at 17.10.25
ダグ ホイト
エスアイビーアクセス
売り上げランキング: 817,069

感想

Lispは関数型ではない

 勉強し始めてから学んだのですが、Lispは関数が中心の言語ではありますが、必ずしも関数で書かなくてもいい言語でした。

 なんならオブジェクト指向っぽくも書けますし、手続型でも書けます。

 こうした自由度の高さはJavaScriptに近い感じがしました。

REPL楽しい

 今までコンパイル言語ばかり触ってきたので、すぐに評価してテストできるのはとても楽しい体験でした。

 コンパイル言語や静的型付けが悪いとは思えませんし、いい面も多いのですが、試しながら書く趣味のプログラミングならこちらのほうが好きですね。

現代言語に劣らない

 正直かなり前に開発されたはずの言語にかかわらず、高度なストリームや高階関数を使ったコレクション、オプショナルな引数など新しい機能が含まれています。

 だから、Lispが最近の言語に比べて面倒だと思うことは少なかったです。今でもこれなら、昔はもっと突出した言語だったんだろうなと感じます。

 逆にいうとLispのエッセンスはかなり最近の言語に取り入れられていて、Lispでなくてはいけないという部分は大分減っている気もします。

マクロ難しい

 単なるテンプレートかと思っていましたが、難しいです。

 何が難しいかといえば、こうすれば楽になるというパターンを導きだすのが難しいです。普段の癖で、何でも関数で抽象化してしまったり、楽にできる場面を見逃すことが多いです。

 書籍を読みながら幅は広げていますが、いまだにマクロを自在に使うという段階まで来ていないです。

自由と代償

 Lispの良さも悪さも自由から来ていると思います。

 構文までいじくれる言語なので、どんな書き方、どんなデータ構造でも自在に作れるのですが、それゆえにプログラマの技量・思想にすべてがゆだねられている言語という印象です。

 正直、今の自分であれば、やり方のパターンがある程度固まっているJavaScriptのほうが間違いなく早く書けます。

 そういう意味でLispが神の言語というよりは、Lispを自由に扱えるようになったプログラマが神の域に近づくというのが正解のような気がします。

 だから、自分は1か月勉強しましたが、スタートラインに立っただけで、Lispの本質に近づけていないような気がします。

まとめ

 Lispには深さがあると思います。特にマクロを作るマクロだとか、マクロでクロージャを操作するという発想を見たときに、考え方の深さに驚きました。

 オブジェクト指向や関数型も勉強して楽しかったのですが、これにマクロが組み合わさるとどこまで表現が深くなるんだろうかとドキドキします。

 正直にいうと、Lispは万人が勉強すべきという感じはしません。関数型をやりたいならJavaScriptHaskellScalaあたりでいいのかなと思います。

 でも、プログラミングの魅力をもっと味わいたいならこの言語はベストに近いと思いました。

 今後はEmacsと本格的なLisp処理系を入れて、もっと遊んでみたいです。