Tclでスタックを簡単に展開する方法はありますか? 私は文字通り特定のスタックフレームに戻る必要があるこの奇妙な問題を抱えています。 info
コマンドを使用してすべてのフレーム情報を取得できますが、実際に特定のフレームに到達するには、各プロシージャにローカル変数をいくつか設定し、それに応じてチェックする必要があります。私は簡単な方法があるかどうか疑問に思っていました。別のTclスタックフレームに戻る
答えて
ローカル以外のリターンを行うためにコードを取得する必要がある場合(すなわち、いくつかのレベルをバックスキップ)あなたは、以降return
から-level
オプションで8.5からこれを行うことができます。次の例を参照してください。
proc foo-a {} {
puts a-in
foo-b
puts a-out
}
proc foo-b {} {
puts b-in
foo-c
puts b-out
}
proc foo-c {} {
puts c-in
foo-d
puts c-out
}
proc foo-d {} {
puts d-in
bar
puts d-out
}
proc bar {} {
puts bar-in
return -level 3
puts bar-out
}
foo-a
これは特別な種類の例外をスローすることで機能します。詳細はかなり隠されています。また、8.6またはスクリプト化された実装がある場合は、try
とthrow
を使用することもできます(8.6のコードの説明で使用されたTclコードのTcler's Wikiを参照)。それがここにマジック値(42の場合は、古いTclのバージョンで
は、最も簡単なメカニズムはreturn -code 42
を使用すると、最大スタックcatch
に代わってカスタム例外をいくつかのコードを入れて、決定することであり、それは結果になるだろうcatch
)、適切に応答します。これは非常に効果的ですが、面倒です。 8.5以降では、使いやすいツールが提供されます。
簡単な答えは、おそらくあなたのデザインを考え直す方がよいだろうということです。
長い答えはこれを行うための唯一の実際の方法(私が考えることができる)は、エラーを投げ、それを停止する必要があるレベルでバックアップをキャッチすることです。もちろん、コールスタックのすべての方法で変数をチェックするのに難しい方法ではありません。しかし、制御フローにエラーを使用すると、悪い形になります。
あなたが最先端になりたいなら、コルーチン(8.6で利用可能)があなたのニーズを満たすかもしれません。
そうでなければ、そこにいるとき(グローバル変数を[info level]に設定する)に必要なルーチンのレベルを書き留めてから、深いproc [ uplevel]を絶対スタックフレームに追加します。ような何か
proc need-to-be-here {} {
set ::myframe [info level]
deeper-calls
}
proc deepest-call {} {
uplevel #$::myframe {what I need to do}
}
(未テスト)
+1は、「アップレベル」を悪用するためのものです。私が維持しなければならないコードのようなものを使用しないでください! :-) –
- 1. スタックフレーム内の戻り値をプッシュ
- 2. Ascii数値をTCLのテキストに戻す
- 3. TCLプロシージャの戻り値と戻り値の差1
- 4. グローバルフレームとスタックフレーム
- 5. スタックフレームのアセンブリコードを分析するには?
- 6. Tcl - list/dictと匿名プロキシの区別
- 7. スタックフレームを取得する
- 8. TCL 8.4.13のTCLバイトコードローダ?
- 9. tclスクリプトをメインのスクリプトで入手せずに別のtclスクリプトから実行するには?
- 10. tclライブラリ:tcl_eval()を使用してcコードのtclコマンド拡張の戻り結果を設定する方法は?
- 11. TCLプロシージャーを別のディレクトリーにポイントする方法
- 12. スタックフレームの必要性、ARM
- 13. tclファイルから重複する行を削除して別のtclファイルに出力するawkコマンド
- 14. tclに複数のリストのtclリストを作成するには?
- 15. TCL:変数で実行するtclコマンド
- 16. 別のクラスに戻る時間
- 17. TCL:\。
- 18. Linuxカーネルでのシグナルハンドリングのためのスタックフレーム
- 19. TCLでC exeファイルの戻り値を取得する方法(Windows)
- 20. は私のスタックフレームは、従来の1
- 21. スタックフレームのレイアウトを理解するのに助けが必要
- 22. TCL - STDINをexecに送る
- 23. スタックフレーム上のアクセスリンクとは何ですか?
- 24. TCLのlappendは、下記の別の階層
- 25. TCL TCL CスレッドとTCLスクリプトスレッドからvwait変数を設定する
- 26. Vivado GUIのtclスクリプトに引数を渡す方法tcl console
- 27. tcl/tkを使用して文字列を別のリストに分割する
- 28. 複数の引数を持つ別のtclスクリプトからtclスクリプトを呼び出す
- 29. C++でスタックフレームを全面的に巻き戻す方法はありますか? (例外を除いて)
- 30. 再帰的なスタックフレームから戻ったときに値が保持されませんか?
デバッグまたは...? –
実行中。私は、ある手続きから別の手続きに移行する必要があります。 – ilya1725
ドナル・フェローの答えは完璧だと思うが、「スタックをアンロールする」という言葉は、ほとんどのプログラマーの心にある例外処理/デバッグに深く関わっている用語なので、主語の言い直しが必要である。どのようにして賢明に言い換えるのか? – kostix