紺屋高尾

ぬしの女房はんに、わちき、なりたいんざます。来年三月十五日、年季(ねん)が明けるんざます。そのときは眉毛落として歯に鉄漿(かね)染めて、ぬしの傍に参りんすよって、お内儀(かみ)さんにしてくんなますか?

LISPのS式による前置記法について

前置記法は気持ち悪い?

よくLISP族における前置記法が気持ち悪い、読み難いという話を聞きます。 Lisperの多くは「そんなことない」「むしろ読みやすい」といいます。 なぜ同じプログラマーなのにこのような真反対な意見が生まれるのでしょうか?

; S式による前置記法の基本的な例

(+ 1 1) ; 1 + 1 = 2 となる

正直、僕も初めてCLを触った時に前置記法が気持ち悪いと感じました。 ですが今は気持ち悪いとも読みにくいとも書きにくいとも感じません。

なぜ?単なる慣れ?

単なる慣れではないと考えています。 ではなぜか?実は他の言語と少しだけ表記方法が違う、思想が違うだけで根本は変わらないからだと考えます。

例えばRubyでメソッドに引数を渡す場合は

hoge(1)

のように書きます。 メソッドに引数を渡す、Rubyだけではなく一般的なプログラミングのスタイルです。 恐らくS式に慣れていない方はこのスタイルだとほっとするのではないでしょうか?

でもちょっと待って! これ、カッコの位置をちょっとだけずらすとどうなるでしょうか?

(hoge 1)

なんとS式になりますね。 そう、実はカッコの位置が違うだけで他の言語のとそうは変わらないのです。

Lispでは+や-といった演算子も他の演算子と区別せず、同一に書いているだけなのです。 つまり「前置記法」なんて言われても身構える必要はなく、単純に関数を最初に書いて次に引数を書いていけばいいだけなのです。

ちょっと多言語と比較

; Common Lisp

(defun fib (n) ; 関数fibを定義, (n)はfibへの引数
  (if (< n 2) ; ifと条件
    n ; then
    (+ (fib (- n 2)) (fib (- n 1))) ; else
  ) ; if終わり
) ; 関数fibの定義終わり

; lispでは最後のコッカは以下のようにまとめることが多い

(defun fib (n)
  (if (< n 2)
    n
    (+ (fib (- n 2)) (fib (- n 1)))))
# Ruby

def fib(n)
  if(n < 2)
    n
  else
    fib(n - 2) + fib(n - 1)
  end
end

こうやってみると、確かに括弧の数は多いかもしれないけれど、そこまで他の言語と変わらないと思いませんか? +や-や<などの演算子も他の関数と同じように扱っているだけなんです。

だけって言われても、、、と思うかもしれませんが、ちょっと勇気を出して挑戦してみませんか? 意外とすぐに違和感なく自然に書けると思いますよ :D