言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Cat 言語 in Javascript

この週末は Cat 言語の Javascript 版を作っていました。作者さんによるオリジナル版が壊れていたので直しただけですが、Cat と Joy の違いがよく分かりました。まだ関数定義が出来ないので、はっきり言って面白い事は何も出来ないけど、今日の成果をとりあえず晒します。

http://www.languagegame.org/pub/interpreter.html

Cat と Joy の最大の違いはクォーテーションです。Joy では、関数オブジェクトとリストを同一視するという美しい設計になっていたのですが、残念ながら Cat では別物です。その理由は、Cat が強い型付けを持つ言語である事に由来しています。リストにはあらゆるオブジェクトがあらゆる順序で格納されるのに比べて、強い型付けの言語では関数合成の順序は厳格なルールに則って行われます。だから別々にする必要があるのです。Joy での関数合成は cons するだけで良かったのですが、Cat では compose という別の関数が用意されています。また、Joy と違って合成した関数を再度分解する事は出来ません。この決定が言語デザインの他の部分にどう影響を及ぼすのか大変興味深い所です。

Javascript 版は、型チェックを全然してないので、雰囲気を味わうためのなんちゃって版とお考えください。以下二の階乗を求めるプログラムです。

[2] dip [[2 mul] dip] [1 sub dup 0 gt] while pop
(例)
10 [2] dip [[2 mul] dip] [1 sub dup 0 gt] while pop
stack: 1024