ziguzagu.org

Common Lisp に入門して得たこと、学んだこと

今年のいつだったか忘れたけど「Common Lispやろう」と思い立って、すこーしずつやってきた。まだ入門の初期段階だけど得られたことについてまとめて、トレタ Advent Calendar 2019の1日目の記事とする。残念ながらまた遅れた…。そして仕事ではCommon Lispは無縁だし一切関係はない。

入門にあたって

新しく言語を学ぶときはだいたい書籍を一冊選んで写経することから入るのだけど、Common Lisp については最高の書籍があった。

Land of Lisp

Land of Lisp

たんに Common Lisp の入門本というだけでなく、(Common Lisp の性質もあってか)これまでのプログラミング人生で読んだ本のうち間違いないく記憶に残る名著で、きっと今後も何度か読んでいくような気がする。とにかくすばらしい本。

強力な「リスト」の概念

Emacsを通してなんとなく理解はしてたリストだったけど、ちゃんとCommon Lispに入門して得られたリストの概念はそれこそ強力だった。

値と次のセルのポインタ。リストはこの2つの要素をもつコンスセルがつなぎ合わさったもの。

つまり自分もよく知っていた単純な連結リストですべてのシンタックスが表現されていて、それを操作する原始的な関数群が用意されてる(car、cdr、caddr、cddar…)だけといえばだけなんだけど、データ構造が全部これで説明も実装もできるというのは、自分が経験した言語では一切考えもしないことだった。

コードもデータも同じシンタックスで表せる、という概念

これも結局はリストの話といえば話だけど「コードとデータがまったく同じシンタックスである」というのは最初は????だった。が、よくよくみて理解できたときには、これもまた自分が過去に経験した言語では一切考えたこともない表現、概念で、改めてLispが今まで経験したどの言語とも似ていないものたらしめている要因だった。

人間が読みやすいかどうかはちょっといまだ謎いけど、この概念は強力すぎてどう説明したらよいのかちょっとわからない…。

マルチパラダイムの意味

手続き型、オブジェクト指向、関数型、ジェネリックなどなど「マルチパラダイムな言語」というのはいっぱいある。Common Lispもマルチパラダイム。なんだけど「すべてのパラダイムにおいて同じシンタックスが使われる」というのはどの言語にもない特徴。他の言語にあるパラダイムに応じて書き方を変える・選択するというのがないのは、それすらも含めてマルチパラダイムであるという意味でLispの最大の特徴。

なんだか「リストすごい」みたいな話しかしてないような気もするけど、いや、すごくすごいのでしょうがない。

高水準言語の機能の原理

Common Lisp を学んでて「(高水準)プログラミング言語の原子みたいな感じ」というイメージを何度も抱いた。リスト、シンタックス、対称性のある関数、lambda、など「Lispですべてのプログラミング言語表せるのでは?」と何度も思ったし、自分の手に馴染んでる言語にある機能、シンタックスも結果としてすべてがLispにある概念に帰結する感じがされた。

Emacsが楽しい

Emacsを15年以上使ってるけど、なんとなくでリストというもの理解して、他のEmacs Lispを見様見真似で最低限の言語や機能を理解した上で設定書くくらいの感じでしかなかった。それがCommon Lispに入門してからはEmacs Lispをどんどん読み書きできるようになって、Emacsがまた楽しくなってきた。

IDEは便利だし生産性を向上させるすばらしいもので自分も使いこなせたらとは思うのだけど、毎度トライするたびに結果的にEmacsに戻ってきてしまったのは、つまるところこういう「自分の馴染む道具を作っていく楽しさ」を無限に見いだせてしまうところというのを改めて実感した。

プログラミング、やっぱり楽しい

決して読みやすいとも思えないし、イマイチ理解に苦しむ関数名とかそういのもいっぱいあるし、なにか長くなると未だに頭が追いつかないときもあるけど、この「(高水準)プログラミング言語のための原子」とも思える概念の塊であるこの言語は、いろいろな点で自分の視野を広げつつ、今までのプログラミング体験の点と点をつなぐ感じが大変気持ち良い。

結果としてプログラミングという行為そのものがより楽しくなる。

つまりはそういうことだ。