On Update スクリプトに関する本質的問題
問題
GeoGebraで、自由な点オブジェクトA:(1,1)、および自由な点オブジェクトB:(3,1)を作成した。
そして、数値オブジェクトa:Distance[A,B]を作成した。
このとき、下記のそれぞれのGeoGebraスクリプトを、点AのOn Updateの欄に記述して、入力バーにSetValue[A,(2,1)]を入力して実行した場合に、点Bの座標がいくつになるかを答えよ。
(1)
SetValue[B,(x(B)+Distance[A,B],y(B))]
(2)
SetValue[B,(x(B)+a,y(B))]
(3)
UpdateConstruction[ ]
SetValue[B,(x(B)+Distance[A,B],y(B))]
(4)
UpdateConstruction[ ]
SetValue[B,(x(B)+a,y(B))]
解答
(1)(4,1)
(2)(5,1)
(3)(4,1)
(4)(4,1)
解説
あるオブジェクト(ここではAという名前のオブジェクトとします)のOn Update の欄に記述したオブジェクトは、オブジェクト名に「A」が入っている場合には、更新後の状態のオブジェクトを表し、それ以外の場合には更新前の状態のオブジェクトを表します。
設問でいうと、(1)に登場するDistance[A,B]というオブジェクトは、名前に「A」が入っていますので、点Aを更新したあとの状態における2点A,Bの距離(すなわち1)を表します。一方で、設問(2)に登場するaというオブジェクトは、名前に「A」は入っていませんので、点Aを更新する前の状態における2点A,Bの距離(すなわち2)を表すということになります。設問(1)と(2)の違いは、これが原因となっています。
ただし、UpdateConstruction[ ]以下のスクリプトに関しては、名前にかかわらず、すべてのオブジェクトが、更新後の状態のオブジェクトとして扱われます。設問(3)2行目のDistance[A,B]も、設問(4)2行目のaも、ともに点Aが更新されたあとの2点A,Bの距離(すなわち1)を表しています。そのため、設問(1)(3)(4)は結果が一致します。