WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Архив » Hello, TCL!

Hello, TCL!


Дата публикации: 17-03-2013

Помните ли вы первые компиляторы для 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!".

Домен продается

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Апрель 2024 (1)
Октябрь 2018 (14)
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта



Случайная цитата

Roberto Waltman:

"Объектно-ориентированная версия «спагетти кода» — это, конечно, «лазанья код» (очень много слоев)."

Опрос

Как Вам новый дизайн сайта?

Отлично
Неплохо
Нормальный
Ужасно