2016-11-09 3 views
0

Я запускаю воплощение tcl 8.5, встроенного в другую систему. Эта система будет принимать и правильно выполнить такую ​​команду:Переменная замена в tcl

uniformDist minAndMax {1 10} 

где uniformDist является какой-то объект, к которому у меня нет внутренней видимости.

Я хочу, чтобы иметь возможность сказать что-то вроде:

set M 1000 
uniformDist minAndMax {1 M} 

, но это не работает. также не множество М 1000 uniformDist minAndMax {1} $ M

Я пробовал:

u minAndMax {1 [eval $M]} 

и

u minAndMax {1 [eval M]} 

Ни одна из этих работ.

Сообщение об ошибке:

expected a real value: unable to convert from: "$M"Error: expected fewer arguments [Error while parsing pair]

или

expected a real value: unable to convert from: "[eval"Error: expected fewer arguments [Error while parsing pair]

Что такое правильный путь, что TCL делает это?

ответ

3

Переменная замена выражается с использованием $ и имени переменной (например, $M или ${M}).

Это не работает:

uniformDist minAndMax {1 $M} 

потому, что брекеты предотвратить замену: $M это только (суб) строка 'доллар, верхний корпус м.

Это работает:

uniformDist minAndMax [list 1 $M] 

потому что аргументы в списке будут оценены перед списком {1 1000} возвращается и передается uniformDist.

Будет также работать форма "1 $M", и вместо замещения переменных выше может быть использована подстановка [set M].

Документация: Summary of Tcl language syntax

+0

Вот оно! Благодаря! – elbillaf

+1

Существует также '' 1 $ M "' и '[subst {1 $ M}]', но команда 'list' имеет наименьшие сюрпризы с помощью сложных подстановок. –

+0

'' 1 $ M "' уже в тексте :) –

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