私は、なぜ装具expr
を付けるべきなのかについて、ドナル・フェローズの優れた説明を読んでいました。
tcl コンパイラが自動的{}
にexpr
? この自動ブレーシングが失敗する条件は何ですか?
tcl コンパイラが自動的
{}
にexpr
?
8.0 の一部のアルファ版で実際にそうしました。より広いコミュニティがそれを絶対に嫌っていたので、それは削除されました. コア Tcl 言語 (Tcl(n) マニュアル ページの 12 のルール) は、非常に小さくシンプルに保たれ、すべてに均一に適用されます。
特別なケースはありません。これは、ほとんどの Tcl プログラマーが望んでいることです。
私の記憶が正しければ、オートブレーシングは と のために特に考慮されましif
たwhile
。ではif
、コマンドの結果のテストで中括弧を省略することは、Tcl 7 では特に一般的でした。これは、Tcl 7 の方が高速であったためです (式エンジンは、恥ずかしいほど遅かった)。ではwhile
、中括弧の省略が一般的なユーザー バグだったためです。
この自動ブレーシングが失敗する条件は何ですか?
まあ、それは次のようなもので顕著になります:
set a 1
set b 2
set op +
set c [expr $a$op$b]
現在、それは に設定c
されてい3
ます。自動ブレースを使用すると、構文エラーになります (式の文法には、3 つの変数を連続して処理する機能がないため)。回避策が提案されました:
set c [eval expr $a$op$b]
しかし、率直に言って、二重置換 (および実行時の式のコンパイル) が本当に必要な場合を除いて、全員に式をブレースさせる方が良いと考えられていました。
二重置換は、ほとんどの場合、セキュリティ バグの兆候であり、常にパフォーマンスの問題の兆候です。それを行うためのより良い (より速く、より安全な) 方法は事実上常にあります。表情を引き締めます。それはより安全で、より速く、そして本当に簡単です。何が気に入らないのでしょうか?