Igor Nikolaev <Igor_Nikolaev@f266.n5030.z2.fidonet.org> wrote:
IN> Victor Wagner <Victor_Wagner@p27.f219.n5020.z2.fidonet.org> wrote:
>> Человека который бы занимался перводом док я не знаю. У меня самого
>> периодически возникает (но быстро угасает в силу нехватки времени)
>> желание написать книжку на русском по Tcl, чтобы ее потом на английский
IN> Ты можешь хотя бы рыбу FAQ (ну хотя бы содержание написать)?
IN> Я готов поучаствовать задавая дурацкие вопросы.
Давай с этим все-таки в список рассылки. tcl@ice.ru который.
По поводу faq - tcl FAQ занимает по-моему около мегабайта и является
скорее перечислением всех имеющихся расширений, библиотек и программ.
А то что собственно FAQ - называется fmm - frequently made mistakes.
Вот его и следует читать.
А так в качетве часто издаваемых ответов:
1. В tcl нет ключевых слов. В tcl нет синтаксиса, который можно
разбирать парсером на yacc. В tcl есть три вида подстановки -
бэкслэш-что-то, $переменная и [команда] и два вида закавычивания -
"cтрока с пробелами" - внутри выполняется все три вида подстановки
и {произвольный кусок с сбалансированными фигураными скобками}
Hу еще есть namespaces и массивы (почему-то с круглыми скобками)
Все остальное является командами с аргументами. Hекоторые из этих команд
считаются частью ядра языка, некоторые определяются с помощью
подгружаемых бинарных модулей, некоторые - как процедуры в самом ядре.
Hекоторые из этих команд выполняют определенные виды подстановок в своих
аргументах. Это всегда описано в соответствующих манах.
Если запомнить эту нехитрую логику, то вопросов "а почему у меня \r
воспринимается как два символа, а не как один - не будет.
2. Знак комментария (#) в tcl это фактически процедура с переменным числом
аргументов, которая не делает ничего. Поэтому несбалансированные скобки
в комментариях, бэкслэш в конце строки, а также появление этого знака
там, где ожидается не имя команды, а что-то другое приводят не к тем
результатам, которые ожидает человек, привыкший к другим языкам.
3. Программы на Tcl бывают либо выполняющиеся последовательно, либо
событийно управляемые. В последних while 1 { } использовать крайне не
рекомендуется, ибо пока выполняется обработчик события, другие
обработчики не получают управления. Если нужно сделать что-то долгое из
обработчика события, используйте команду after
4. Команда exec _не_ вызывает shell. Ее аргументы парсятся по правилам
tcl (см. п. 1) и передаются вызванной команде в качестве argv. Поэтому
не следует ожидать что exec "команда с кучей аругментов" или
exec awk '/куку/ {print $0}' будут работать. В первом случае используйте
либо
eval exec "команда с кучей аргументов"
либо
exec $env(SHELL) -c "команда с кучае аргументов"
Во втором -
exec awk {/куку/ {print $0}}
5. При запуске медленно работающей программы из событийно-управляемого
скрипта (например gui-шного)
set f [open "|program" r]
fileevent readable $f {something}
предпочтительнее, чем exec, поскольку exec без & в конце останавливает
выполнение скрипта (в том числе реакцию на события) до окончания
выполнения программы.
6. Tcl не выполняет внешних программ в качестве команд. То что вы
запустили tclsh, набрали там ls и получили результат - это глюк.
Так бывает только в интерактивной сессии, но не в скрипте.
7. Еще раз повторяю. Во время работы обработчика события или основного
скрипта, никакие прочие обработчики не выполняются. В том числе и
перерисовка окон.
Поэтому цикл
for {set i 0} {$i<255} {incr i} {
.canvas create line 0 $i 255 $i -fill [format "#%02x%02x%02x" $i $i $i ]
}
не будет рисовать на экране цветные линии по одной. Вы увидите их только
все сразу, когда цикл закончится и управление попадет в цикл обработки
событий.
Если вам нужен прогресс-индикатор, используйте команду update внутри
цикла (она, кстати, обрабоатет и нажатие на кнопку cancel при
необходимости)
-- -------------------------------------------------------- Victor Wagner @ home = vitus@wagner.rinet.ru I don't answer questions by private E-Mail from this address. -- end of forwarded message --
-- С тем, что не помешает никогда, Kittle