2014-10-14 4 views
0

Я использую {*} в tcl для расширения аргументов и сталкиваюсь с этой проблемой.Использование расширения аргумента {*} с более чем одним оператором

#!/usr/bin/tclsh 

set reset { 
     set count 0; 
     set age 24; 
} 

puts $reset 

eval $reset; # This is working fine. Commented out the below line and tried 

{*}$reset; # This is throwing error. Commented out the above line and tried. 

if { [ info exists count ] && [ info exists age ] } { 
     puts "count & age initialzed to $count and $age" 
} else { 
     puts "count & age not initialzed :(" 
} 

Как вы видите, у меня есть переменная сброса определяется и я оценка с eval, а также с {*}.

Хотя eval работает отлично, {*} бросает ошибку как

wrong # args: should be "set varName ?newValue?" 
    while executing 
"{*}$reset" 

Тогда я изменил переменную reset следующим образом,

set reset { 
      set count 0; 
    } 

т.е. я удалил 2-ое set заявление и код работает отлично.

Почему {*} работает нормально с одним утверждением и не более чем с этим? Или что мне здесь не хватает?

+0

Эмм, даже с одной командой, это не 'работа' как таковой, потому что '$ count' будет иметь значение' 0; 'вместо' 0', что фактически объясняет проблему: ';' интерпретируется как строка, а не как метасимвол для кода. – Jerry

+0

Да. Джерри. Ты прав. Теперь только я это наблюдаю. Тогда в одном случае можно использовать только одну команду? – Dinesh

+1

Я бы не советовал использовать расширение аргумента как это, потому что я не думаю, что это причина, по которой '{*}' был реализован. Чтобы оценить код, используйте 'eval' и для расширения списка используйте' {*} '. – Jerry

ответ

2

Команда облегченного eval и uplevelwhile и if и т.д.) может оценивать сценарии, то есть струны/списки, которые состоят из нуля или более командных вызовов. Когда вы вызываете {*}$reset, вы получаете шесть слов вместо одного, но интерпретатор все еще ожидает одного вызова команды. Фактически вызывается команда set с пятью аргументами, и команда будет неактуальна.

Расширение слова на несколько слов работает до тех пор, как формы расширения точно одна команда вызова:

set foo bar 
# => bar 

Слишком мало слов:

set cmd set 
# => set 
{*}$cmd 
# => wrong # args: should be "set varName ?newValue?" 

Слишком много слов:

set cmd {set foo baz ; set abc def} 
# => set foo baz ; set abc def 
{*}$cmd 
# => wrong # args: should be "set varName ?newValue?" 

Право:

set cmd {set foo} 
# => set foo 
{*}$cmd 
# => bar 
set cmd {set foo baz} 
# => set foo baz 
{*}$cmd 
# => baz 

Также впору:

set cmd set 
# => set 
{*}$cmd ghi jkl 
# => jkl 
set cmd {set mno} 
# => set mno 
{*}$cmd pqr 
# => pqr 

Документация: eval, if, set, {*}, uplevel, while

+0

Спасибо за объяснение Hoodiecrow. :) – Dinesh

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