多値と多重代入と Kink

多値と JVM の続き。

Kink という言語を作ってるんですけど、ここでは RubyPython と同様に、多値はサポートせず、多重代入を可能にしています。ただし、多重代入は特別な構文ではなく、単なる関数呼び出しです。

式の値の数という観点では、 RubyPython と同様に、 1 個に固定です。 C 系言語で void 型になるような式は、 Ruby では nil, Python では None という「値」になりますが、 Kink では base という「値」になります。値が無い = void 型ではなく、「なんもないよ」を表す値が 1 個あるわけです。で、多値はありません。多重代入ができれば、プログラムを書く上では充分だ、という判断に基づきます。

RubyPython では、多重代入は特別な構文ですが、 Kink の多重代入は単なる関数呼び出しです。というか、代入自体が単なる関数呼び出しです。

たとえば、単一代入は次のように書きます。

@NUM = 42

これは、変数参照に対する関数呼び出しであって、以下と同等です。

@NUM.op_set(42)

多重代入は次のように書きます。

[@ID @VALUE] = stdin.line / ','

これは、変数参照を要素として持つリストに対する関数呼び出しであって、以下と同等です。

[@ID @VALUE].op_set(stdin.line / ',')

同様に op_set を定義すれば、変数参照やリストに限らず、代入の左辺に置けるわけです。ただ、こういった柔軟性と引き換えに、プログラムの静的解析が困難を極め、最適化の手段が限られてしまうという難点があります。