MochiKitと日本語は相性が悪い?

brazilさんのMochiKit解説記事(http://d.hatena.ne.jp/brazil/20060122/1137926216)を読んでいて、関数型言語風のプログラムは読みにくいなと思った。読みにくい原因をつらつらと考えてみると、日本語の言語構造と前置型が相性が悪いのが原因の一つではないかと思った。

MochiKitJavaScriptのライブラリである。Pythonの影響を受けており、Lispなどの関数型言語風な記述が出来る。brazilさんの記事で取り上げられているサンプル・コードはこちら。

theSum = sum(takewhile(
  partial(operator.gt, 10),
  imap(
      partial(operator.mul, 2),
      count()
  )
));

ok( theSum == (0 + 2 + 4 + 6 + 8) );

theSum には10未満の2の倍数の合計値が格納される。詳しくは元記事を参照のこと。

私にはこのコードが読みにくい。今までは、その原因は関数型言語に慣れていない為かと思っていた。とはいえ、C++, Ruby, JavaScriptで関数オブジェクトやクロージャを利用しているので、関数オブジェクトや汎関数には慣れているはずである。

そこで、言語のシンタックス、つまり文法が原因にあるのではと思った。前置型(関数名を最初に記述する文法)は英語との相性が良い記法である。MochiKitでは前置型が採用されている。そのため、サンプル・コードを英語に読み下すのは簡単である。一方、日本語は後置型の言語と相性が良い(例:http://hima.chu.jp/doc/)。そのため、サンプル・コードを日本語に読み下すのは難しく、コードの理解が難しい気がする。

試しに、サンプル・コードを後置型のシンタックスで書き換えてみた。

(((( count() 
    (2, operator.mul) partial ) imap ) 
   ((10, partial.gt) partial) takewhile) sum) = theSum;

これならば、日本語に書き下せる。例えば、こんな感じだろうか。

カウンタ・イテレータと「2に引数を掛けた値を返すファンクタ」からマップ・イテレータを作り、このイテレータを「10が引数より大きいとき正の値を返すファンクタ」が正の値を返す間実行し、それらの結果の和を求め、theSumに格納する。

つまり、日本語のシンタックスと、プログラムのシンタックスが一致するため、両者間での翻訳が容易である。

結局、前置型のプログラム言語の読み書きには、思考を英語風のシンタックスで表現する必要がありそうだ。つまり、アルゴリズムを英語で説明できなければならない。これは、結構しんどいので、日本ではMochiKitはあまり流行らない気がする。