2016-10-31 11 views
0

変数の割り当てと使い方がTclでどのように機能するのか分かりません。すなわち[...]と[expr ...]で苦労しているtclスクリプト

:私は

set a 5 
set b 10 

ような何かを、私は何をインターネットに続き

set c [$a + $b] 

を行う場合

言う:

あなたはコマンドの結果を得ますコマンドを四角に置くことによって 括弧([])。これは右、だから私の文は15cを設定する必要があり

C.

中の機能のshプログラミングにおけるバック単一引用符 ( `)の同等、または機能 の戻り値を使用しているのですか? の場合は、どのような違いがありますか

set c [expr $a + $b] 

? いいえの場合、その声明は何をしていますか?

答えて

1
set c [$a + $b] 

上記のコマンドを実行すると、invalid command name "5"というエラーメッセージが表示されます。

数学的操作ではTclはすべてを文字列として扱うため、exprのみに依存する必要があります。この場合

set c [expr $a + $b] 

abの値が渡され、加算が行われます。ここで

、それは常に安全であると評価のあらゆる可能性の驚きを避けるために

set c [expr {$a+$b}] 

、などの表現を引き締めるすることをお勧めします。

更新1:Tcl

、すべてがコマンドに基づいています。ユーザー定義のprocまたは既存の組み込みコマンド(lindexなど)を使用できます。ベアワードの文字列を使用すると、コマンド呼び出しがトリガーされます。同様に、[]の使用も同じことを引き起こします。あなたのケースでは

$aは変数 aの値に置き換えられ、彼らは角括弧で囲まれているので、それはコマンド呼び出しをトリガーと名前 5とはコマンドがないので、あなたがエラーを取得しています。

+0

これはまさに私が持っているエラーです。それはなぜそのエラーを返すのですか?どのような操作が実行されますか? – user8469759

+0

'[5 + 10]'は '+'と '10'を引数にして' 5'というコマンドを実行しようとします。エラーが示すように、「5」というコマンドはありません。 –

+0

それは$ aの結果を文字列として解釈しますか? – user8469759

1

Tclは、そのコアでは本当に厳しい言語です。 は常に規則に従います。あなたのケースのために、私たちはそのため、このようにそれを分析することができます:

三つの言葉、 set(すなわち、標準コマンド「変数への書き込み」)、 c、と私たちはの内容を評価から取得します
set c [$a + $b] 

角括弧は[$a + $b]です。これは、別の3つの単語、a変数(5)、+、およびb変数(10)の内容を含む単一のコマンド呼び出しによって形成されるスクリプトです。値が数字のように見えるのは無関係です。ルールはすべてのケースで同じです。

おそらく5というコマンドがないので、エラーが発生します。あなたは事前にこれをしなかった一方、:

proc 5 {x y} { 
    return "flarblegarble fleek" 
} 

を、あなたのスクリプトは、「仕事」だろう、c変数にいくつかの(明確に定義された)全くのナンセンスの言葉を書きます。幾分数学的な式を評価する場合は、exprコマンドを使用します。それは、すべての引数(それらの間にスペースを入れて)を連結し、理解された文書化された小さな表現言語を使用して結果を式として評価することです。

FWIWという式の前後には、常にカッコを入れたいと思っています。


あなたが書いたものをあなたが期待するようにする他の方法はありますが、しないでください。彼らは遅いです。あなたが+最初に入れて喜んでいる場合OTOH、あなたはものが最小の干渉で速く行くことができます:

# Get extra commands available for Lisp-like math... 
namespace path ::tcl::mathop 

set c [+ $a $b] 

あなたは、Lispスタイルのプレフィックス数学のファンではないなら、exprを使用しています。結局のところ、ほとんどのTclプログラマがやっていることです。

+0

真に、「未知の」ハンドラはパフォーマンスに大きな影響を与えます。あなたがする必要がない場合はそれらを使用しないでください... –