(fwd) Часто издаваемые ответы по Tcl Re: perl + ?

Andrey Gerzhov (kittle@freeland.alex-ua.com)
Sun, 16 May 1999 14:44:30 +0300 (EEST)

-- forwarded message --
Path: freeland.alex-ua.com!routki.ki.yurteh.net!carrier.kiev.ua!srcc!Gamma.RU!ddt.demos.su!f400.n5020!f238.n5020!f1851.n5020!f509.n5020!f114.n5020!f219.n5020!wagner!not-for-mail
Newsgroups: fido7.ru.unix
Distribution: fido7
X-Comment-To: Igor Nikolaev
Approved: gateway@fido7.ru
From: Victor Wagner <Victor.Wagner@p27.f219.n5020.z2.fidonet.org>
Date: Fri, 14 May 99 21:40:39 +0400
Subject: Часто издаваемые ответы по Tcl Re: perl + ?
Message-ID: <7hhqn7$s9t$1@wagner.wagner.home>
References: <925466202@f930.n5020.z2> <925843478@p28.f255.n464.z2> <7ha1cf$npa$1@wagner.wagner.home> <7hc8kj$88g$3@sensi.pu.ru>
Organization: Wagner's home
X-FTN-AREA: RU.UNIX
X-FTN-MSGID: wagner.wagner.home 4d01a264
X-FTN-REPLY: sensi.pu.ru f78ac0da
Sender: vitus@wagner.wagner.home
NNTP-Posting-Host: localhost
X-FTN-Tearline: ifmail v.2.14.os-p2
X-FTN-Origin: Wagner's home (2:5020/219.27@fidonet)
X-FTN-SEEN-BY: 50/993 463/68 159 464/34 469/38 478/25 4614/1 4631/13 4635/4
X-FTN-SEEN-BY: 5001/15 17 5002/16 5003/15 5011/13 201 5013/8 5020/69 78 114 157
X-FTN-SEEN-BY: 5020/166 204 214 215 219 238 241 294 322 400 423 427 462 509 525
X-FTN-SEEN-BY: 5020/620 642 644 672 741 758 789 876 1351 1381 1851 2200 5022/5
X-FTN-SEEN-BY: 5023/1 11 5028/51 5029/34 5030/23 115 251 568 818 5049/256 5054/3
X-FTN-SEEN-BY: 5055/86 97 5058/24 5061/15 5066/2 5075/10 5077/3 28 5080/80 5084/10
X-FTN-SEEN-BY: 5094/5094 5095/29
X-FTN-PATH: 5020/219 114 509 1851 238
X-FTN-PATH: 5020/400
Lines: 99
Xref: freeland.alex-ua.com fido7.ru.unix:6892

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