Вопрос

Я работаю с TCL/TK, недавно начал использовать TCL/TK в своих приложениях автоматизации и жажду знаний.

Чтобы продолжить длинную череду вопросов о скрытых функциях, я хотел бы узнать о любых скрытых или удобных функциях TCL/TK или о любом простом методе выполнения некоторых крупных операций.

Это было полезно?

Решение

Когда специалист по маркетингу в Sun объявил, что Tcl "Enterprise Ready", разработчики добавили следующую функцию:

$ tclsh
% clock format [clock seconds] -format %Q
Stardate 63473.2

Другие советы

Моя любимая " скрытая или удобная функция " как работает цитирование в Tcl. Мне нравится использовать фразу . Я также хотел бы сказать, что вам нужны только фигурные скобки, когда вам нужны фигурные скобки "

Хотя в большинстве языков есть правила, для которых для определенных целей необходимо использовать разделители блоков (например, в C вы должны использовать {} для обозначения блока), Tcl не такой строгий.

С помощью Tcl вы можете выбрать любой символ цитирования, который даст вам необходимый эффект. Конечно, есть лучшие практики, но в конце концов вы выбираете символ цитирования, который лучше всего позволяет вам выполнить работу.

Это означает, например, что вы можете определить процедуру разными способами, в том числе:

proc foo {args} {
    .... body here ....
}

proc foo "args" "
    .... body here ....
"

proc foo args [some code that returns the body]

... и так далее. То же самое касается условных операторов, циклов и всего остального. (для непосвященных фигурные скобки примерно эквивалентны одинарной кавычке оболочки, двойные кавычки похожи на двойные кавычки оболочки, а квадратные скобки похожи на обратную косую черту оболочки.).

Теперь многие люди смотрят на это и говорят WTF? но это действительно дает большую мощность программисту. Мы часто получаем вопросы в comp.lang.tcl в духе «если я сделаю« this {и $ that} », как мне получить $ this для расширения?». Ответ следует за старой шуткой «пациент: доктор, мне больно, когда я делаю этого доктора: не делай этого». То есть, если вам не нравится поведение, которое вы получаете с одним набором разделителей, выберите другой разделитель. Тот факт, что оператор if обычно создается с помощью фигурных скобок, не означает, что его необходимо создавать с помощью фигурных скобок.

Это мой любимый " скрытый " Особенность Tcl. Он не скрыт - он прямо на чудесно завершенной, но краткой справочной странице по Tcl (n), но последствия не ясны, пока вы не поймете, как работает Tcl.

Еще одна неочевидная особенность заключается в том, что нераспознанные команды переходят в обработчик с именем " unknown " который вы можете переопределить. Например. чтобы неизвестные команды обрабатывались как выражения для оценки:

$ tclsh
% 2+2
invalid command name "2+2"
% proc unknown args {uplevel 1 [linsert $args 0 expr]} 
% 2+2
4

Дополнительные примеры можно найти на вики-странице Модификация радикального языка

Команда [trace] Tcl позволяет вам перехватывать чтение и запись в любую переменную. Это позволяет вам реализовать наблюдателя для любой переменной и добавить автоматическую проверку диапазона произвольной сложности для любой переменной (как если бы вы обращались к переменной через установщик / получатель). Вы также можете создавать автоинкрементные переменные, используя эту технику.

proc varlimit_re {re var key op} {
  upvar $var v
  if { [regexp -- $re $v] <= 0 } {
    error "$var out of range"
  }
}

trace add variable ::myvar {write} [list varlimit_re {^[A-H]\d{3}-[0-9a-f]+$}]`

Если вы попытаетесь установить для myvar значение, которое не соответствует регулярному выражению, вы получите ошибку времени выполнения.

Удобная функция, которая не скрыта, но, как правило, неочевидна для людей, пришедших с других языков, заключается в том, что вы можете определить свои собственные структуры управления (или даже переопределить существующие, если хотите жить опасно). В есть примеры на Tcl Wiki

.

Tcl - такой простой, открытый язык, скрытых возможностей очень мало. Это все доступно для программиста для расширения и адаптации.

Все ключевые слова Tcl " являются обычными командами Tcl, включая управляющие структуры, такие как [for], [foreach], [while] и т. д. Это означает, что вы можете расширить язык, написав новые управляющие структуры в чистом коде Tcl.

Например, структура try / on / trap был реализован в Tcl 8.6a с использованием только кода Tcl. Точно так же tcllib содержит control :: do, структуру управления do / while.

Многое из этого стало возможным благодаря командам [upvar] и [uplevel], которые позволяют вам обращаться к переменным или выполнять код в другом фрейме стека.

ИМХО, самая большая скрытая особенность Tcl — это его С API. Используя это, очень легко обернуть базовую программу или подсистему C и написать графический интерфейс или другие функции на Tcl.Хотя эта функция не является уникальной для Tcl, Tcl был разработан для этого с нуля, и с API C особенно легко работать.

Вторая величайшая скрытая особенность — это упаковщик, дедушка всех менеджеров геометрии.Благодаря этому графический интерфейс может иметь большие окна с удивительно небольшим количеством кода.Важно отметить, что в Tcl/Tk управление геометрией существовало как минимум за 10 лет до появления .net.

Третьей важной особенностью Tcl является возможность расширения языка либо через C API, либо с помощью команд, определенных в Tcl.Это не совсем макросы LISP, но, тем не менее, довольно гибкие. Ожидать является очень хорошим примером приложения, построенного на расширении языка Tcl для создания языка сценариев, специфичного для предметной области.

РЕДАКТИРОВАТЬ: ну, черт возьми, Xt действительно был менеджер геометрии, хотя я согласен с Натом в том, что это несколько больнее, чем стая ;-}

<Ол>
  • [имена массивов] - один из первых вопросов, которые задают новички о том, как перебирать массив
  • также тот факт, что вы можете foreach {key1 key2} {$ list1 $ list2} {...} - даже если списки имеют разный размер
  • вы не должны использовать комментарии между случаями переключения (это не крутая функция, но проблема, которую большинство разработчиков не понимают
  • команда rename может переименовать любую функцию / proc
  • Я думаю, что команда time замечательная. Это не совсем скрыто, но это не мешает людям спрашивать "какая функция быстрее" время от времени в comp.lang.tcl.

    В любое время, когда вы хотите узнать " сколько времени это займет? " или "какой метод быстрее?" Вы просто звоните через «время» команда. Нет создания объектов, нет математики, нет накладных расходов, исключительно просто. Другие языки имеют аналогичную функцию, хотя некоторые из них менее элегантны.

    Хорошо документированный C API также позволил легко интегрировать в Perl. Мой опыт работы с Tcl / Tk восходит к 1995 году, но в 2000 году я обнаружил Perl / Tk и никогда не оглядывался назад.

    И в последнее время пакеты Tcl и Tkx Perl предоставляют нам современный графический интерфейс. И два вышеупомянутых модуля, хотя и не тривиальные, содержат относительно мало кода, учитывая то, что они позволяют делать за пределами языка. И это может быть напрямую связано с превосходным API (и мощью Perl, очевидно).

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top