2016-11-09 56 views
0

這是從On tcl tests - how to interpret tcltest::test派生。

下面是從TCL8.4手冊頁:

[7] 變量替換。
如果一個單詞包含一個美元符號(「$」),然後是下面描述的形式之一,那麼Tcl將執行變量替換:美元符號和後面的字符在單詞中被替換爲變量的值。變量替換可以採取任何的如下形式:

$name
名稱是一個標量變量的名稱;該名稱是一個字母,數字,下劃線或名稱空間分隔符(兩個或多個冒號)的一個或多個字符的序列。

因此,沒有字母如字母,數字,下劃線或冒號的單個$應該是語法錯誤。

或者它實際上是一個TCL解析器錯誤,但是因爲沒有這樣的真實世界的腳本,所以我們逃避它呢?

對不起,如果我看起來很瘋狂挑剔,只是想了解。

+0

該手冊頁是_incredibly_ rules-lawyer-y。如果它沒有_say_這是一個錯誤,它不會是一個錯誤,並且默認是沒有什麼特別的。 –

回答

1

仔細記下的變量替換規則的措辭:

如果一個字包含一個美元符號(「$」)跟隨以下

這描述的形式一個具體表示如果一個單詞包含$,但沒有跟隨變量名的有效格式,則它只是文字字符$,因爲沒有發生替換。再次請注意,我小心粗體地加上了「替代」一詞。

在tcl中,$規則不是識別Perl或PHP等變量的規則。將一個字符串替換爲另一個字符串是一條規則(將其想象爲簡化的s/var/value/運算符)。

您可以嘗試以下操作:

set foo hello 

puts $foo  // prints hello 
puts hello$foo // prints hellohello (note the "contains" wording of the rule) 
puts $   // prints $ 
puts hello$  // prints hello$ 
puts hello$hello // errors out about $hello not existing 

所以$本身並不是一個語法錯誤。

發生了什麼變化可能是表達式解析器。但爲此,您不需要查詢替換規則,您需要閱讀手冊頁expr(我已經閱讀了8.4和8.6手冊頁,並且沒有關於裸字符串的任何內容,所以它可能是8.6之前版本的expr中的一個錯誤)

+1

應該指出,儘管tcl只有13條語法規則,但規則非常準確。我的意思是數學意義上的「準確」 - 每個定義的每個詞都有意義。很多tcl的行爲是新興的 - 它們是通過規則相互作用而不是自己指定的。 – slebetman

相關問題