多値と JVM の続き。
Kink という言語を作ってるんですけど、ここでは Ruby や Python と同様に、多値はサポートせず、多重代入を可能にしています。ただし、多重代入は特別な構文ではなく、単なる関数呼び出しです。
式の値の数という観点では、 Ruby や Python と同様に、 1 個に固定です。 C 系言語で void 型になるような式は、 Ruby では nil, Python では None という「値」になりますが、 Kink では base という「値」になります。値が無い = void 型ではなく、「なんもないよ」を表す値が 1 個あるわけです。で、多値はありません。多重代入ができれば、プログラムを書く上では充分だ、という判断に基づきます。
Ruby や Python では、多重代入は特別な構文ですが、 Kink の多重代入は単なる関数呼び出しです。というか、代入自体が単なる関数呼び出しです。
たとえば、単一代入は次のように書きます。
@NUM = 42
これは、変数参照に対する関数呼び出しであって、以下と同等です。
@NUM.op_set(42)
多重代入は次のように書きます。
[@ID @VALUE] = stdin.line / ','
これは、変数参照を要素として持つリストに対する関数呼び出しであって、以下と同等です。
[@ID @VALUE].op_set(stdin.line / ',')
同様に op_set を定義すれば、変数参照やリストに限らず、代入の左辺に置けるわけです。ただ、こういった柔軟性と引き換えに、プログラムの静的解析が困難を極め、最適化の手段が限られてしまうという難点があります。