2017-03-14 4 views
0

私のtclスクリプトには、コードの一部がたくさん繰り返されているので、その中から手順を作りたいと思っています。Tcl:mainからprocedureにすべての変数を渡す

このパートでは、数多くの変数を使用していますが、これはプロシージャの引数として渡すことを避けたいものです。プロシージャーにすべての変数を表示させる方法はありますか? (実際には、 "main"を "goto"のような手続きに分岐してからメインに戻り、続けてほしい)。

編集:これは手順である必要はありません。これを行うための他の方法をお勧めします。重要な部分は、mainから関数/プロシージャに渡すすべての変数/引数を宣言する必要はありません。

例:

proc dummy_proc {} { 
set var1 $var2 
set var2 $var3 
} 

set var2 2 
set var3 3 
dummy_proc 
puts "$var1 $var2" 
# should print "2 3" 

答えて

2

と呼ばれているこれは、それが(変数から来るかの値が急に変化するか、変数は直接の表示はありません)読み、コードを困難にすることができるという事実に可能ですが、一般的にはお勧めできません。しかし、これにより、繰り返しコードが減少することがあります。

使用upvarhttps://www.tcl.tk/man/tcl8.6/TclCmd/upvar.htm):

proc dummy_proc {} { 
    upvar var1 v1 
    upvar var2 v2 
    upvar var3 v3 

    set v1 $v2 
    set v2 $v3 
} 

upvarは、呼び出し元のスコープに別の変数を参照するローカルスコープ内の変数を作成することです。

またあなたもuplevelhttps://www.tcl.tk/man/tcl8.6/TclCmd/uplevel.htm)を使用して試すことができます:

proc dummy_proc {} { 
    uplevel { 
     set var1 $var2 
     set var2 $var3 
    } 
} 

uplevelupvarに似ていますが、代わりに変数の参照を作成するには、実際には、呼び出し元のスコープ内でコードを実行します。これは、一時的に呼び出し元関数に戻り、コードを実行して戻ってこないように戻った場合と同じです。呼び出し元のスコープでコードを実行するので、呼び出し元のスコープに表示されているすべての変数が、レベルを上げたコードに表示されます。 Uplevelは、関数の代わりにマクロのように振る舞います。

+0

重要な部分は、mainから関数/プロシージャに渡すすべての変数/引数を宣言する必要はありません。だから、これは私にとってはうまくいかないでしょう。これを明確にするために質問を更新しました。 – user2405602

+0

@ user2405602:アップレベルの解決策は見ましたか? – slebetman

+0

私はそれを見ました、私はそれを試して、私は幸せなキャンピングカーです!それはうまく動作します。ありがとう、たくさんの男。 – user2405602

0

使用global

proc dummy_proc {} { 
    global var2 var3 
    set var1 $var2 
    set var2 $var3 
} 

set var2 2 
set var3 3 
dummy_proc 
puts "$var1 $var2" 

あなたが合格したいグローバルの多くを持っている場合は、いくつかのforeachを使用できますが、道を持っている必要がありますよりも、それらすべてを見つける。
すべてのグローバルがGLOBAL_<SOMEARG>

proc dummy_proc {} { 
    foreach glb [info globals GLOBAL_*] { 
    global $glb 
    } 
    ... 
} 
+0

ありがとう、重要な部分は、mainから関数/プロシージャに渡すすべての変数/引数を宣言する必要はありません。だから、これは私にとってはうまくいかないでしょう。これを明確にするために質問を更新しました。 – user2405602

関連する問題