コール時に評価されるTclプロシージャにどのようにデフォルトの引数を提供しますか?Tcl:呼び出し時にデフォルトのargsを埋めるためのステートメントを評価する方法
は、ここで私が試したものの一例です:
> tclsh
% proc test { {def [expr 4 + 3]} } { puts $def }
too many fields in argument specifier "def [expr 4 + 3]"
% proc test { {def {[expr 4 + 3]}} } {puts $def}
% test
[expr 4 + 3]
% test 5
5
% proc test { {def {[expr 4 + 3]}} } {puts [$def]}
% test
invalid command name "[expr 4 + 3]"
% proc test { {def {[expr 4 + 3]}} } {puts [eval $def]}
% test
invalid command name "7"
例は、単にコードを簡素化することです。もちろん、この単純な例では、{def 7}
を使ってprocのデフォルト値を設定するだけです。
しかし、目標は、test
プロシージャが呼び出されているときはいつでも良いデフォルト値を提供するより複雑な関数を呼び出すことができるようにすることです。したがって、デフォルトはさまざまです。
% proc test { {def {}} } { if {$def == {}} { set def [expr 4 + 3] } ; puts $def }
% test
7
% test 5
5
は、しかし、私は十分にこのエレガントではない考えてみます:
私の現在のソリューションは、空の文字列をデフォルトとそれをチェックすることですヘッダーで:そこは、彼らが所属する宣言を置くための方法であるべきです。
また、空の文字列は、デフォルトの呼び出しで置き換えられない呼び出し元によって与えられる完全に細かい値である可能性があります。
もう1つの回避策は、パラメータとしてargs
を使用して、それを検査することです。しかし、それはあまり明示的な宣言スタイルを提供しません。
私は宣言的なprocヘッダーにevalをどのように組み込むことができますか?
(私があるため、市販のツール環境での使用をアップグレードする方法はありませんとTcl8.4に思います。しかし、このサイトのために、私はまた、より近代的なTCLバージョンの答えを奨励するだろう)
8のためのソリューションを。4は、それ以降のバージョンと同様に有効です。過去20年近くのこの特定の分野に大きな変更はありませんでした(ただし、ベストプラクティスはその間に変更されました)。 –
最近、このトピックについていくつか質問がありました。この質問を参照してください:http://stackoverflow.com/q/9736524/7552 –
@Donald:1週間前にtcl 8.5での展開について議論しましたので、宣言的な構文がさらに変更されている可能性を疑っていました。 。 – cfi