Помните ли вы первые компиляторы для Windows-платформы? Составление программы напоминало заклинание духов, когда под ваше невнятное бормотание "WM_INIT..., WM_PAINT..., WM_DESTROY ..., WM_QUIT" после долгих часов кропотливого труда на свет наконец появлялась очередная версия программы "Hello, World!", которая умела выводить предупреждающее окно "Воистину Hello!"...
С тех пор много воды утекло. Скорости процессоров и объемы, занимаемые на дисках средствами разработки выросли на два порядка, создание приложений почти полностью перешло на плечи всезнающих Wizard-ов... Прогресс не остановить. Но как быть, если всего-то и нужно,что вывести окошко "Hello, World"? Вы пробовали написать такую программу с использованием современных технологий? Получается выполнимый файл на несколько мегабайт, при этом просто так он может и не заработать. Заботливые производители уже давно написали массу функций на все случаи жизни, которые и располагаются в тех нескольких больших файлах с расширением .DLL. Да, в тех же DLL наверняка находятся и функции для вызова фирменных секретных заставок (все, наверное знают, что в Excel 5.0 есть свой маленький Doom, а в Excel 97 - Flight Simulator...).
http://perevozka24.ru/arenda-spetstehniki/benzovozy/moskva - это сайт, который предоставляет такую довольно редкую услугу, как аренда бензовоза. Перед вами ставят огромный выбор бензовозов, которые отличаются по марками, емкостью ценой. Также вы можете заработать, если у вас имеется свой бензовоз. Вы тоже можете стать его в аренду и цену устанавливаете только вы. На сайте вы найдете позитивные отзывы клиентов, которые подтверждают надежность сайта.
И вот - счастливый момент настал. Вы положили свеженаписанную программу "Hello World" на свою страничку в GeoCities, или у других добрых дядей, выложили баннер на LinkExchange, и тысячи заинтересованных пользователей начали заполнять свои гигабайты дискового пространства, проклиная такой медленный сегодня Интернет. А стоило ли вообще из пушки да по воробьям палить?
У каждого из нас, так или иначе занимающихся Вебом, то и дело возникают всякие мелкие задачки - "А хорошо бы взять да вот во всем поддереве каталогов поменять адрес фирмы внизу html-файла... А вот мне бы шаблон для странички, да чтоб не один, да чтобы для его получения не продираться через дюжину pop-up меню и drop-down списков... А хорошо бы, когда вставляешь картинку на страничку, чтобы хоть размер в ней проставлялся, а то как-то тут говорили, что иначе страничка становится уж очень динамической - то туда текст прыгнет, то сюда..."
Конечно, можно поставить FrontPage и он сам все сделает. И width и height пропишет, и даже поле alt заботливо поставит. Можно воспользоваться и другими подобными средствами. Многие из них даже позволяют видеть и редактировать сырой HTML-код.
Правда, некоторые из них почему-то считают, что им обязательно надо вмешаться и поправить то, что с их точки зрения вы написали неправильно. Как, например, DreamWeaver от компании Macromedia. Если бы не его "интеллект" - замечательный продукт был бы.
Я уже давно смотрел на Unix (в частности, на Linux и FreeBSD) как на идеальный вариант операционной системы для человека, выросшего из пеленок Windows. Я люблю думать самостоятельно, и не прихожу в восторг, когда скрепка начинает давать ценные советы по ходу дела. К тому же отъедая при этом пару (десятков) мегабайт места. Итак, Unix. Отлично. Купили CD от UrbanSoft (спасибо ребятам за хорошую работу), воткнули, поставили, запустили X... и все отлично. Нужна программа "Hello world" ? Пожалуйста. Есть масса готовых интерпретаторов. На любой вкус. Но хочется чего-то большого, светлого, и с кнопочкой "OK" вместо судорожного печатания строки из "мусора" каждый раз при запуске программы. А программу под X написать - в общем, тоже не боги горшки обжигают, но не хочется. Тогда на помощь приходит Tcl/Tk.
Собственно, сам по себе язык - это Tcl. В общем-то ничем не отличающийся от других интерпретатор, работающий в текстовом режиме. Но вот "/Tk" в конце - это как раз то, что нас интересует. Это набор средств ("Tool Kit") для работы с оконной подсистемой X. Причем существует спектр функций достаточно широкого диапазона. Благодаря своеобразному и простому синтаксису Tcl, эта библиотека органично вливается в язык.
А синтаксис языка сам по себе достаточно простой. Если говорить коротко - то существует два понятия - функция и объект (оконный). Синтаксис работы очень похож на вызов команд из командной строки - тоже у многих из них есть опции, задаваемые знаком дефиса перед ними, так же параметры не находятся в скобках, как и в командной строке.
Программа "Hello, World!" на Tcl/Tk для Windows выглядит так:
tk_messageBox -message "Hello, World!"
При этом создается стандартное message-окно Windows. При помощи опций мы можем, например, вывести иконку с восклицательным знаком и тремя, а не одной кнопками:
tk_messageBox -icon question -type yesnocancel -message "Are you
really saying /"Hello?/""
В этой же строчке, кстати, продемонстрирован пример экранирования двойных кавычек, поскольку в строке, заключенной в двойные кавычки, производятся подстановки переменных. Т.е., в результате работы фрагменте кода:
set hello "Hello, "
set world "World !"
set greeting "Greeting:$hello$world"
переменная $greeting примет значение "Greeting:Hello, World!".
Рассмотрим более сложный пример - редактор с возможностями привязки простых макрофункций к некоторым клавишам:
### begin
### Глобальные переменные
set font {"FixedSys" 12}
set workdir "/home"
set workfname ""
eval destroy [winfo child .]
wm title . "Simple (HTML/Perl) editor"
# создаем группу, в которой будут помещены кнопки
frame .topframe -borderwidth 0
pack .topframe -side top -fill x
# формируем сами кнопки
button .topframe.quit -text "Quit" -command "exit"
button .topframe.load -text "Load" -command "fileDialog . .html open "
button .topframe.save -text "Save" -command "fileDialog . .html save "
button .topframe.doperl -text "DoPerl" -command "DoPerl .html"
# упаковываем их в рамку
pack .topframe.quit -side left
pack .topframe.load -side left
pack .topframe.save -side left
pack .topframe.doperl -side left
# создаем и упаковываем главный элемент редактирования
text .html -font $font
pack .html -side left -expand y -fill both
# делаем привязку функции вызова Perl
bind .html {DoPerl %W}
# макроподстановки "вокруг выделения"
bind .html {HTML_Insert %W "<p>/n" "</p>"}
bind .html {HTML_Insert %W "<ul>/n" "</ul>"}
bind .html {HTML_Insert %W "<li>" ""}
bind .html {HTML_Insert %W "<br>" ""}
bind .html {HTML_Insert %W "<hr size=1 noshade>" ""}
# процедура вставки фрагментов до и после выделенного блока
proc HTML_Insert {w before after} {
if {[$w tag nextrange sel 1.0 end] != ""} {
set seltext [$w get sel.first sel.last]
$w delete sel.first sel.last
} else {
$w see insert
set seltext {}
}
set toinsert "$before$seltext$after"
$w insert insert $toinsert
}
# процедура открытия - сохранения файлов
proc fileDialog {w editbox operation} {
# следущие две строки объявляют, что по указанным именам будет
# идти доступ к глобальным переменным (по умолчанию
# все переменные - локальные
global workdir
global workfname
# задание типов для диалога
# Type names Extension(s) Mac File Type(s)
#
#---------------------------------------------------------
set types {
{"HTML files" {.html} }
{"Text files" {.txt .doc} }
{"Text files" {} TEXT}
{"All files" *}
}
# вызов необходимого диалога
if {$operation == "open"} {
set file [tk_getOpenFile -initialdir $workdir -filetypes /
$types -parent $w]
} else {
set file [tk_getSaveFile -initialdir $workdir -filetypes /
$types -parent $w -initialfile $workfname /
-defaultextension .txt]
}
if [string compare $file ""] {
# если файл был выбран, то присвоить значения именам текущего
файла и
каталога
set workdir [ file dirname $file ]
set workfname [ file tail $file ]
if {$operation == "open"} {
# открываем файл и прочитываем его внутрь элемента редактирования
set fhandle [open $file r]
set contents [read $fhandle]
close $fhandle
$editbox delete 0.0 end
$editbox insert 0.0 $contents
} else {
# сохраняем содержимое элемента редактирования в файл
set contents [$editbox get 0.0 end]
set fhandle [open $file "w"]
puts $fhandle $contents nonewline
close $fhandle
}
}
}
### вызов интерпретатора Perl, при этом исполняется то, что находится
# в данный момент в элементе редактирования
# результат работы программы (ее stdout) отображается в отдельном окне
proc DoPerl {editbox} {
set content [$editbox get 0.0 end]
# сбрасываем содержимое буфера во временный файл
set file [open "test.pl" "w"]
puts $file $content nonewline
close $file
set w ".execres"
set w_exist [winfo exists $w]
if !$w_exist {
toplevel $w
wm title $w "Execution results:"
# открываем новое окно со скроллером и элементом редактирования
frame $w.frame
pack $w.frame -side top -fill x
scrollbar $w.frame.yscroll -relief sunken /
-command "$w.frame.page yview"
text $w.frame.page -yscrollcommand "$w.frame.yscroll set" /
-width 80 -height 20 -relief sunken -wrap word /
-highlightthickness 0
focus $w.frame.page
pack $w.frame.yscroll -side right -fill y
pack $w.frame.page -side top -expand 1 -fill both
pack $w.frame -side top -fill both -expand 1
}
$w.frame.page delete 0.0 end
# помещаем результат выполнения в новом окне
$w.frame.page insert 0.0 [exec "perl" "./test.pl" ]
}
##### end
Конечно, наша маленькая записная книжка не является венцом творения, однако она обладает огромными возможностями расширения. Например, скомбинировав вызов Perl и запись во временный файл соержимого, можно (внешним скриптом) проводить какие-либо подстановки.
В авторском варианте по определенной комбинации клавиш вызывается диалог, который позволяет выбрать файл с растровой картинкой, а затем вызывает скрипт, написанный на Perl, который возвращает полный тег HTML для этого изображения. Находится в подготовке и скоро будет размещен на http://www.ocs.ru/~andin/tcl/ вариант, когда макроподстановки смогут содержать произвольное количество параметров, при этом они будут браться из внешних файлов.
Кроме того, поскольку в дистрибутивном комплекте находится библиотека HTTP, то можно легко организовать чтение файла прямо с WWW-сервера. В Сети также можно найти несколько вариантов реализации FTP для Tcl/Tk, что открывает возможности по сохранению файла прямо на сервере.
Хотя идея использовать Tcl/Tk для приложений Web не нова - я наткнулся даже на Web-сервер, написанный на этом языке, однако производительность этого сервера доказывала малопригодность серверных приложений на Tcl/Tk.
По моему мнению - Tcl/Tk - неплохое средство для разработки небольших клиентских приложений, как раз для тех случаев, когда надо чуть больше, чем просто сказать: "Hello, World!".