2015-12-17 1 views
0

Я искал lappend $var1 $var2, но не нашел точного ответа, как он будет выполнен.

% set a {a b c} 
a b c 
% set b {d e} 
d e 
% puts [lappend $c $b] 
can't read "c": no such variable  >>> here it throws error like variable not exist 
% puts [lappend $a $b] 
{d e}      >>> here it doesn't throw any error, can someone explain it and how to print the value of $a, if $a is a new variable 
% puts $$A 
can't read "A": no such variable 
% puts $$a 
$a b c 
% puts ${$a} 
can't read "$a": no such variable 
+0

Пожалуйста, отформатируйте свой вывод кода так, чтобы он отображался как код. Я думаю, вам нужно добавить отступ в каждую строку (см. Подсказки редактора). – Brandin

+0

Подобная основная причина проблемы [здесь] (http://stackoverflow.com/q/17559577/1578604) – Jerry

ответ

1

lappend «первый параметр является имя переменной, а не значение. Поэтому в целом это должно быть:

lappend var1 $var2 

где оба var1 и var2 являются переменными списка. См. Tcl lappend man page для более подробной информации.

5

У Tcl есть два уровня синтаксис, что он строго относится ко всему. Первый уровень является общий синтаксис Tcl, который принимает:

lappend $var1 $var2 

и разбирает его к трем словам: lappend, слова, полученные путем считывания переменной var1, и слово, полученное путем считывания переменной var2.

Затем Tcl отправляет команду, названную первым словом (lappend, встроенный Tcl), который применяет обработку синтаксиса команд. В случае lappend это довольно просто: первый аргумент называет переменную, а второй и последующие аргументы - это слова для добавления в список в названной переменной.

В вашем случае первый аргумент, который называет переменную, получается путем чтения другой переменной (var1), а значение для добавления в список происходит из переменной (var2); такое имя, как a b c d e, является именем юридической переменной в Tcl, но это действительно неудобно использовать. И шанс очень высокий, что вы не хотите писать, что: размещение имен переменных в переменной обычно является индикатором запутанного кода. Вы можете сделать это, но вы вряд ли когда-либо захотите это сделать (за исключением случаев, когда вы используете имя переменной с upvar). Вы, вероятно, на самом деле имел в виду, чтобы написать:

lappend var1 $var2 

Tcl является очень точным о различии между именами переменных и переменным содержанием. $ не является декоративным! Здесь можно сказать «прочитайте эту переменную прямо сейчас», а $var1 практически эквивалентен [set var1] в семантических терминах. (The $ сокращенная позже, функция Tcl 2.0 путь обратно в тот же день!)


Tcl также не допускает двойного разыменования с $$vrbl. В редких случаях вам это нужно, вы делаете [set $vrbl]. И если вы это сделаете, вы, вероятно, должны сразу увидеть, можете ли вы использовать массив, поскольку это, как правило, лучший выбор ...

Смежные вопросы