読者です 読者をやめる 読者になる 読者になる

やろーじだい

ブログです

なぜ Common Lisp は楽しいのか - Aizu Advent Calendar 2014

この投稿は Aizu Advent Calendar 2014 の 12 日目の記事です。

次の人

@kanm_in

前の人

@1ouis

初めに

 Advent Calendar の説明通りに好きなことについて書いたら完全にきつい感じのポエムになりました。
 ですます調がくどかったので、だである調に修正しました。

動機

 私はプログラミングが苦手でできない。ある程度でも形にできたものは数少なく、Github に唯一公開している2つ小さいプログラムは CL(Common Lisp) で書かれている。つまり CL は私のなかではなんとか形にするまでプログラムを書ける言語で、触ったなかでは一番に楽しいと感じた言語だった。なぜなんとか形にすることができ、なぜ楽しい感じたのか考えてみた。

なぜか

マルチパラダイム言語ということ

 私はこの言語が人生で触った初めての関数型プログラミングをサポートしている言語だった。それまでは C, C++, Java に触っていた。高校 1 年から触っていたので完全に頭は手続き脳だった。CL で関数型プログラミングという手法に触れて、今までしていたプログラミングが考え方の一つにすぎないというのが分かった。しかし長年の手続き的な考え方は抜けきるものではないし、手続き的な考え方の方が楽に考えられることは沢山あった。そのためこの言語は思いついた方で書けるので相性がよかった。loop をつかったり、副作用を使って書いてもいいし、純粋な関数を意識したり、再帰でも書ける。そして不都合が出てきたら修正するということができる。最初から無理に関数型で考えなくてもよいというのは気楽だった。
 マルチパラダイムというのは関数型と手続き型だけを意味するのではなく、あらゆる書き方に対応できるという意味である。自分が言語にあわせるのではなく、言語が合わせてくれる感覚で書いていくことができるようになる。

REPLの存在

 REPL とは与えられた式を評価して、その結果を表示する対話環境で、これの存在のおかげで自分で作った関数が正しい動作をするかどうかや、既存の関数がどういう動作をするのかを思い出すのに利用できる。コード全体をコンパイルしたりする必要が無いので、調べたい関数以外は未完成の状態でも良いのがとても便利だ。
 特に、Common Lisp には Emacs 上で動く(Vimにもある) SLIME と呼ばれる REPL をベースに様々な機能を持った IDE のような存在があり、エラーが出るとバックトラックをしてエラーが出るまでの動作の流れを詳細に確認したり、その場で別な値を渡して停止した所から再開したりできる。

Emacs との相性

 上でも述べたが、Slime の存在も含めて Emacs との相性がとてもよかった。 ある程度使いなれていた Emacs を利用できることはプラスに働らいた。括弧単位での移動や、 smartparens の wrap 機能などは Lisp を書くにあたってとても重宝している。

モジュール化という考え方

 関数型プログラミングの利点になるが、モジュール化というのもこの言語に触れて知った考え方だった。それまでプログラムは全体で一つと無意識に認識していた。なのでどこかでエラーが出て修正ができなければ、そのプログラムを全て投げ捨てていた。
 この考え方と REPL の存在のおかげで、関数が独立してとりあえず動く立派なプログラムであるということを認識できた。とりあえず動くことは、プログラミングが苦手な人にとってとてもに重要だと思う。動くのは嬉しいし楽しい。自分が思いつく関数を作り、それを道具に次の段階に進んでいけるので、完成を1、それ以外を0と考えてしまっていた時とは違い徐々にプログラムができあがっていく感覚があるので、途中でなにもかも投げ捨てたくなりにくい。
 テストの重要性にも関わってくる。

括弧

 知っての通り Lisp は括弧が多く構文が特殊であるが、これはこの言語を触ってみると利点でしかないのがわかる。括弧の中の最初に関数があり、あとは引数という単純な構造でほぼすべて成り立っている。構文について考えることは Lisp を書いている時はほぼない。括弧の対応やインデントはエディタがやってくれるし、正しくインデントされていればスコープと関数と引数との関係が一目でわかる。人によってほとんど差がないので、人のコードを読むときにも意識する必要はない*1
 あたりまえだが全て括弧なので、予期しない式どうしの連結がおきたりしない。

幸運

 Land of Lisp を読んでその後プログラムを実装してみていた時、 Twitterasdf というのを教えていただいた。それがきっかけで CL-Project と QuickLisp の連携の便利さを知った。
 asdf は CL で使われている makefile のようなもので、QuickLisp は CL のライブラリのインストールなどをやってくれるもの。 CL-Project は asdf をつかったプロジェクトの環境構築を自動でやってくれ、QuickLisp を使うと自分のプロジェクトをライブラリのようにロードできるものだ。くわえて自動テスト環境も用意してくれる。これらのおかげでややこしいと感じるパッケージやファイルのロードについてはまる時期が短かかった。
 もし機会があって CL を人に教えるときがあれば QuickLisp と CL-Project はまっさきに教えると思う。はじめ asdf についてよくわかっていない時期にも勝手によしなにしてくれるのでとても便利だった。

おわり

 つまり私の状況に偶然にもすごぶる相性がよかったということがわかりました。偶然を除いても、 CL はプログラミングが苦手な私にも楽しく書けるすばらしい言語だと思います。もし興味がある人がいれば本を貸すなどできるので声をかけてください。私も入門したばかりですが、多少入門の助けになるくらいのことはできるかもしれません。

 2015年はがんばるぞい。

*1:改行とインデントが無いコードは読めない