1

私は、なぜ装具exprを付けるべきなのかについて、ドナル・フェローズの優れた説明を読んでいました。

tcl コンパイラが自動的{}expr? この自動ブレーシングが失敗する条件は何ですか?

4

2 に答える 2

3

tcl コンパイラが自動的{}expr?

8.0 の一部のアルファ版で実際にそうしました。より広いコミュニティがそれを絶対に嫌っていたので、それは削除されました. コア Tcl 言語 (Tcl(n) マニュアル ページの 12 のルール) は、非常に小さくシンプルに保たれ、すべてに均一に適用されます。

特別なケースはありません。これは、ほとんどの Tcl プログラマーが望んでいることです。

私の記憶が正しければ、オートブレーシングは と のために特に考慮されましifwhile。では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]

しかし、率直に言って、二重置換 (および実行時の式のコンパイル) が本当に必要な場合を除いて、全員に式をブレースさせる方が良いと考えられていました。

二重置換は、ほとんどの場合、セキュリティ バグの兆候であり、常にパフォーマンスの問題の兆候です。それを行うためのより良い (より速く、より安全な) 方法は事実上常にあります。表情を引き締めます。それはより安全で、より速く、そして本当に簡単です。何が気に入らないのでしょうか?

于 2015-09-11T05:56:56.747 に答える