シーケンスは参照渡しできない

前回に続き 今回もシーケンスについてです。

突然ですが、以下のコードを実行すると標準出力には何が出力されるでしょう?

var s1 = [ 1 ];
var s2 = s1;

println(isSameObject(s1, s2));   // 同一インスタンスか確認
答えは true です。

当たり前すぎて問題になりませんね。 ^ ^;)
では これは?

var s1 = [ 1 ];
var s2 = s1;
insert 2 into s2;

println(isSameObject(s1, s2));   // 同一インスタンスか確認
実はこれは false になります。
上記のコードとの違いは 変数 s2 のシーケンスに 2 を追加しているだけですので、 常識で考えれば 結果は true になりそうなのに...
実際にシーケンスを標準出力してみると
s1: [ 1 ]
s2: [ 1, 2 ]
のように別ものになっています。

実はここに驚愕の事実が...
シーケンスはオブジェクトの参照を渡すことができない のです。
つまり、変数には シーケンスのコピーが渡されるということです。

実際は上記のように 要素が変更されるまでは コピーではなく 同一オブジェクトを参照しているのですが、 これは 要素が全く同じであれば 同じオブジェクトでもコピーしたオブジェクトでも何ら違いはないので 少しでもリソースを節約するために 本当に必要になるまで コピーするタイミングを遅らせているだけではないでしょうか。

今回のクセも気をつけないとハマりやすいです。
例えば、こんなコードは割と普通に書きそうになりますが 期待通りの動きにはなりませんので注意しましょう。

var group = Group {}
var content = group.content;
insert Rectangle {} into content;