みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
FM12です。前にどっかで見たような気もしますが
Let($i=0;
Evaluate("List(Let($i=$i+1;$i);Let($i=$i+1;$i))")
)
この結果が
2
1
になるのは、一体どうゆうわけでしょうか。
List関数は右から左へ評価する?
と書いてから思いついて、
Evaluate("List(Get(UTCmSECs);Get(UTCmSECs))")
を何度も計算すると、ほとんどは同じだけど確かにたまに右のほうが前の時刻になりました。
Offline
Evaluateは関係なくて、List(Get(UTCmSECs);Get(UTCmSECs))
をLoopで計算させると、常に1行目の方が大きいか等しいようです。
Last関数のルーチンを流用してるのかな。
「Case はそれぞれの式を順に評価」と書いてあるけど、左からとは書いてない。この場合はデフォルトが「最後」にあるから自明なんでしょうけど。
Substituteは左からと書いてあった気がしたけど、今見たら特に明記されてません。
なるほど、Last(List(...))という場合に最適化できるようにしてるのかな?
右からというのが保証されてるなら、それはそれでいいんですが。。。
Let($i=0;
Evaluate("List(Let($i=$i+1;$i);Let($i=$i+1;$i))")
)
List関数は右から左へ評価する?
同じことですが、
Let($i=0;
Evaluate("List(
Let($i=$i+3;$i);
Let($i=-1;$i);
Let($i=$i+1;$i)
)")
)
だとListの順序はあってるけど、
List内のLet式の評価は下から上ですね。
Offline
Let([
s="123";
$i=1;
$v[Let($i=$i+1;$i)]=Middle(s;$i;1)
];
$v[1] & ¶ & $v[2] & ¶ & $v[3]
)
これを見ると、$v[2]だけに1が入ってます。Letの複数の代入文は左から順と明記されてるけど、1つの代入の中では=の右を先に計算していますね。
10年ぶりにFM19でやってみたら
List(Get ( 現在の時刻 UTC マイクロ秒 );Get ( 現在の時刻 UTC マイクロ秒 ))
やっぱり2か3大きい値が先になる...ミリでなくマイクロ秒になったので同じ値にはなりませんね。
List関数は下から評価なんですね。
Offline
Pages: 1
[ Generated in 0.010 seconds, 10 queries executed - Memory usage: 508.95 KiB (Peak: 513.48 KiB) ]