次のような「if」ステートメントの短い構文を使用しています。
proc WriteParameter {Parameter Value} {
# Ugly option - WORKS
if {$Parameter eq "Unique"} {
set Register ControlStatus
set Data ${Value}0
set Mask EF
} else {
set Register $Parameter
set Data $Value
set Mask {}
}
# Elegant option - DOESN'T WORK
set Register [expr {$Parameter eq "Unique" ? "ControlStatus" : $Parameter}]
set Data [expr {$Parameter eq "Unique" ? ${Value}0 : $Value}]
set Mask [expr {$Parameter eq "Unique" ? EF : {}}]
puts $Register-$Data-$Mask
return 0
}
set Value 4E20 ;# Merely hexadecimal number
set Parameter Regular
WriteParameter $Parameter $Value
問題は、洗練されたオプションでは、'expr' ステートメントは常にその引数を整数として扱うため、'Data' が 4e+20 の値を取得することです。これは単に 'Value' の科学的表記法です。
ただし、「データ」を「値」にする必要があります (たとえば、外部レジスタに書き込むため)。
何か案は?