2

これはばかげているように聞こえるかもしれません。我慢してください。で遊んでいるexprときに、次のシナリオに出くわしました

proc badExpr { a b } { 
    return expr $a+$b
}

proc goodExpr { a b } { 
    return [ expr {$a+$b} ]
}

puts "Bad Expression Result : --->[ badExpr 1 3 ]<-----"
puts "Good Expression Result : [ goodExpr 1 3 ]"

出力:

Bad Expression Result : ---><-----
Good Expression Result : 4

ご覧のとおり、procbadExprは空の文字列を返しています。好奇心から、なぜ空の文字列を返すのか知りたいです。

4

3 に答える 3

2

(1) proc badExpr { ab } { return expr $a+$b }

上記の badExpr では、TCL expr コマンドを使用していません。上記の expr は、他の文字列と同様に扱われます。コマンドを使用する場合はexpr、角括弧で囲む必要があります。だからそうあるべきだreturn [expr $a + $b]

return コマンドは1 つの文字列値を返し、さまざまなオプションを指定することもできます。以下のhttp://www.tcl.tk/man/tcl/TclCmd/return.htmのドキュメントによると、最後の値は実際の戻り値です。

return ?result?
return ?-code code? ?result?
return ?option value ...? ?result?

ただし、偶数の任意の引数がある場合、何も返されません。内部で何が起こっているのかはわかりませんが、 -code またはオプションのいずれかを使用すると、値パラメーターが関連付けられます。そのため、各ペアをオプション/値またはコード/値として扱い、関連付けられていない最後のアイテムを結果として返すようです。

#Returns 3
return 1 2 3 4 3

#Returns nothing
return 1 2 3

(2) expr {$a+$b} が機能する理由は、それが proc の最後の式であるためです。プロシージャが明示的な return を実行しない場合、その戻り値は、プロシージャの本体で実行された最後のコマンドの値です。expr {$a+$b} である必要はありません。badExpr のように expr $a+$b にすることもできます。

于 2014-10-26T04:09:20.743 に答える
1

要するに、問題は、 の呼び出しを括弧で囲んでいないことですexpr

return expr $a+$b   ;# no worky
return [expr $a+$b] ;# works (but you should have braces around the arguments)

明確に文書化されていませんがreturn、任意の数の引数を受け入れるようです。引数リストのサイズが偶数の場合、コマンドは空の文字列を返します。引数の数が奇数の場合、最後の引数を返します。これはドキュメントと一致しています。通常の引数リストは、0 個以上のオプション名/値のペアが前に付いたオプションの結果値で構成されます。オプション名が有用なものに限定されていると思われるため、これはまだ少し予想外です。

おー!また、returnがスクリプトの最後のコマンドであり、その唯一の引数がスクリプト評価 (括弧内のコード) である場合は、いつでもスキップできますreturn(いずれにせよ、バイト コンパイラはそれを削除します)。

proc goodExpr { a b } { 
    return [ expr {$a+$b} ]
}

と同じです

proc goodExpr { a b } { 
    expr {$a+$b}
}

ドキュメンテーション: exprreturn

于 2014-10-25T09:31:23.580 に答える