Какой из них является правильным способом использования variable
с или без знака доллара? Я думал, что variable
(без $
) используется только во время variable
декларации (по аналогии с Bash):
set var 10
Во всех остальных случаях, когда variable
упоминается или используется (но не декларируется) надлежащий синтаксис $variable
(с $
):
set newVar $var
puts $var
puts $newVar
Но потом я нашел код, где он взаимозамене и кажется, что этот код работает:
# using argv
if {[array exists argv]} {
puts "argv IS ARRAY"
} else {
puts "argv IS NOT AN ARRAY"
}
# using $argv
if {[array exists $argv]} {
puts "\$argv IS ARRAY"
} else {
puts "\$argv IS NOT AN ARRAY"
}
# using argv
if {[string is list argv]} {
puts "argv IS LIST"
} else {
puts "argv IS NOT LIST"
}
# using $argv
if {[string is list $argv]} {
puts "\$argv IS LIST"
} else {
puts "\$argv IS NOT LIST"
}
Выход:
argv IS NOT AN ARRAY
$argv IS NOT AN ARRAY
argv IS LIST
$argv IS LIST
Редактировать в ответ на @glenn Джекман:
Ваш ответ указал мне на дальнейшие исследования и я нашел, что TCL способен делать какую-то «кода самостоятельно модифицирующего "или что-то еще правильное имя, например:
% set variableName "x"
x
% puts $x
can't read "x": no such variable
% set $variableName "abc"
abc
% puts $x
abc
% puts [set $variableName]
abc
%
%
%
%
%
%
% set x "def"
def
% puts $x
def
% puts [set $variableName]
def
%
Теперь ваш ответ приносит некоторый свет в проблему, но остается один вопрос. Это выдержка из документации:
set varName ?value?
array exists arrayName
Документация говорит, что обе функции ожидают имя переменной (не значение), другими словами, что ожидать variable
вместо $variable
. Поэтому я предполагаю (на основе выше самомодифицирующего кода), что при переходе $variable
вместо variable
произошла замена переменных (точно такая же, как и код выше). Но что, если $variable
содержит то, что не является списком ни одного массива (мои аргументы во время тестирования были: param0 param1 "param 2" param3). С этой точки зрения вывод, который говорит $argv IS LIST
, неверен. Что мне здесь не хватает?
Редактировать в ответ на @schlenk:
Наконец я (надеюсь) понять проблематику. Я нашел great article о TCL, которые объясняют (а не только) эту проблему. Позвольте мне определить несколько мудрое высказывание из этой статьи:
- В Tcl, что строка представляет до команды, что это манипулировать им.
- Вся команда в Tcl - как вы видите, нет оператора .
if
- это команда с двумя аргументами.- Имя команды не является особым типом, а просто строкой.
Также following SO answer подтверждает это утверждение:
«В Tcl, значения не имеют типа ... они ставят под сомнение, смогут ли они быть использованы в качестве данного типа." Команда string is integer $a
означает:
- „Могу ли я использовать значение в
$a
как целое“
НЕ
„это значение в
$a
целое число“«Каждое целое число также действительный список (из одного элемента) ... так что он может быть использован в качестве либо и как строка команды возвращает истину (как будет несколько других для целого) «.
Я считаю, то же самое относится и к string is list
команды:
% set abc "asdasd"
asdasd
% string is list $abc
1
% string is alnum $abc
1
string is list
возвращает 1, потому что $abc
является строка, а также это один элемент списка и т.д. В большинстве учебников есть говорят, что следующий фрагмент является надлежащим способом декларирования и работы со списками:
% set list1 { 1 2 3 }
% lindex $list1 end-1
2
Но когда все в TCL является строкой, в моем опыте также работает следующее (если я ошибаюсь, верьте мне, пожалуйста).
% set list2 "1 2 3"
1 2 3
% lindex $list2 end-1
2
правила замещения чтения Tcl (в человеке Tcl). Сначала вы получаете группировку аргументов, за которыми следует замена переменных и команд, прежде чем вы получите текущую команду. – schlenk
@schlenk Я сделал, несколько раз, но я до сих пор не хватает точки. Извините –