Lisp 布教書 『Land of Lisp』を読んだ

ここが原著の公式サイト.

以下の書籍が実際に読んだ翻訳版. www.oreilly.co.jp

Land of Lisp に載っていること

もうちょっと真面目に

本書の内容は,簡単なゲームの開発などを通して Lisp の文法や機能を解説するというもの.ゲーム開発では隣接リストを用いたグラフ表現が出てきたりする.ゲーム以外だと,Web サーバーを立てたり,DSL を作成したりする(ゲーム開発の一貫だけど).

原文でどう書かれているかは分からないが,訳された文章は軽快で,教科書や技術書というよりも布教書と言いたくなる.

実際に読んでみて

Lispというとカッコだらけの難解な言語,というイメージだった.なにせマスコットは Lisp エイリアン.実際に (Common)Lisp に触れてみると,Lisp は意味不明の謎言語というわけではないことがわかった.

というのも,関数呼び出しなら,

add(2, 5) // いつもの関数呼び出し
(add 2 5) ; カッコ '(' が関数名の右に移動した

値の演算なら,

1 + 2 * 3 // いつもの演算
(+ 1 (* 2 3)) ; add(1, mul(2, 3)) みたいな順序

と,割と自然に解釈できるからだ.

Lisp のおかげか別の言語でラムダ式高階関数を触ったおかげかはわからないが,前に Haskell を勉強したときに比べてはるかに理解しやすかった.読み進めると Lisp にも慣れてきて,心なしか Lisp エイリアンも可愛く見えて……はこなかった. 目が多いのすかんそす……

ちなみに,使ったコンパイラsbcl

www.sbcl.org

カッコが多い ))))

カッコが連続するせいでどれが対応しているかがわかりにくい.これはむしろ,カッコだらけでわからなくなるような大きな関数を作るなという示唆かもしれない.実際,本書に乗っているコードの関数はどれも小さい.小さな部品を組み合わせて期待する機能を実現しており,手続き的に書くのとは全く違うことがわかる.

発見

  • Common Lisp は意外にも手続き的に書ける.
  • 文法はそんなに変じゃない(気がする).
def hello():
  print("Hello World")
(defun hello()
  (princ "Hello World"))

そもそも Hello World ほど小さいコードなら,どの言語も差が小さくなるから比較しても意味がないよね. let を使ったり,リストの操作をしたりするともっとカッコだらけになる.

まとめ

  • Lisp を楽しく学べる.
    ただし,素朴なゲームの開発が中心なので好き嫌いはありそう.
  • 関数型言語の入門にもよさそう(諸説あり).

次は Haskell を学び直そう.