Lispをお勉強している

ここ最近、Lispのお勉強をしている。

Lispと密接な関係があるのがS式。括弧が山のように連なるアレ。こんなやつ

(define (fact n)
  (if (zero? n)
      1
      (* n (fact (1- n)))))

S式はリスト構造を表現するためのリテラルであり、ほとんど構文木でもある。アルゴリズムとデータ構造を同一の表現で記述するやり方は、他の言語には見られない独特のものなんだとか。確かに異彩を放っている感はバリバリする。主に括弧的な意味で。

純粋な記法と見てもメリットがある。閉じ括弧が末尾に畳み込まれるので、コードの縦の長さが圧縮できる。インデントベースと似ている気もする。

初めは「うげぇ読めるわけがない」とか思っていたのだが、しばらく使ってみて分かった。これ括弧じゃなくてインデントで読むのね。(半)自動インデントと括弧対応の強調表示機能が付いたエディタなら編集に困らない。

違和感

基本的にS式は嫌いじゃないのだが、どうしても慣れない部分がいくつかある。どうもその辺が、特にCLOSの部分などは、S式の本質的な制約をあらわにしているような気がする。

一部の関数

SchemeのmapやCLのmapcarのように、リストに対して処理を適用する場合

(map (lambda (arg)
        .....
        .....)
  listA listB)

lambda部分が肥大化すると、オペレータ名と適用対象リストの部分がどんどん離れて読みづらくなっていく。

Rubyだと、リストが一つしかないと割り切った上で、ブロック付きメソッド呼び出しで表現する。

list.map do |arg|
        .....
        .....
end

これはS式の制限なのか、それとも無名関数が肥大化するのは悪い書き方だという事を示唆しているのだろうか?

CLOS
(method object args ...)

「オブジェクトに対して、何かの操作を適用する」と考えるオブジェクト思考的には、オブジェクトが頭に来ないのは混乱する。目の動きは同様にobject → method → argsとなるから、右から左へ読んだりするはめになる。メソッドがチェーンすると……もう考えたくない。

# Ruby
object.method(args ...)

多くのオブジェクト指向言語だと、オブジェクトが先頭。左から右に自然と読める。

まとめ

自分で書くよりも、よっぽど上手に同じような趣旨のことを書いている人はいるもので

S式の最大の弱点は、括弧ではない。述語の位置が常に頭にあることなのだ。しかし同時にこれはS式の最大の利点でもあるのだ。構文木の直接表記は、強力かつ簡潔なマクロを可能とした。しかし1 + 1と書きたいのが、そしてobj.methodと書きたいのが自然人でもあるのだ。

404 Blog Not Found:LLからCL? - 書評 - 実践Common Lisp

弾氏でも同じように感じるのか。