Скрытые возможности TCL / TK [закрыто]
Я работал с TCL/TK ,недавно начал использовать TCL / TK с моими приложениями автоматизации, и я голоден для знаний.
чтобы продолжить длинную линию скрытых вопросов, я хотел бы знать любые скрытые или удобные функции TCL/TK или любой простой метод для достижения некоторых больших операций
11 ответов
когда маркетолог из Sun заявил, что Tcl был "готов к работе", разработчики добавили следующую функцию:
$ 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]
... и так далее. Же условные операторы, циклы и все остальное. (для непосвященных фигурные скобки примерно эквивалентны одинарной кавычке оболочки, двойные кавычки похожи на двойную оболочку цитата, а квадратные скобки похожи на оболочку backtick. ).
теперь многие люди смотрят на это и говорят WTF? но это действительно дает программисту много энергии. Мы часто получаем вопросы в комп.ленг.tcl по строкам "если я делаю" это {и $that}", как я могу получить $that для расширения?". Ответ следует за старой шуткой "пациент: Доктор, больно, когда я это делаю, доктор: не делайте этого". То есть, если вам не нравится поведение, которое вы получаете с одним набором разделителей, выберите другой ограничитель данных. Просто потому, что оператор if обычно строится с фигурными скобками, не означает, что это должны быть построены с фигурными скобками.
Это моя любимая "скрытая" функция Tcl. Это не скрыто - это прямо на удивительно полной, но краткой справочной странице Tcl(n), но последствия не ясны, пока вы полностью не узнаете, как работает Tcl.
другой неочевидной особенностью является то, что непризнанные команды попадают в обработчик под названием "неизвестно", который вы можете переопределить. Например. чтобы неизвестные команды рассматривались как выражения для оценки:
$ tclsh
% 2+2
invalid command name "2+2"
% proc unknown args {uplevel 1 [linsert $args 0 expr]}
% 2+2
4
дополнительные примеры можно найти на странице wiki на Радикальная Модификация Язык
команда [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 такой простой, открытый язык есть очень мало скрытых функций. Все это доступно программисту для расширения и адаптации.
удобная функция, которая не скрыта, но, как правило, не очевидна для людей, происходящих из других языков, заключается в том, что вы можете определить свои собственные структуры управления (или даже переопределить существующие, если вы хотите жить опасно). Есть примеры на Tcl Wiki
все "ключевые слова" Tcl являются регулярными командами Tcl, включая структуры управления, такие как [for], [foreach], [while] и т. д. Это означает, что вы можете расширить язык, написав новые структуры управления в чистом коде Tcl.
например,try/on/trap структура была реализована в Tcl 8.6 a, используя только код Tcl. Аналогично tcllib содержит control:: do, структуру управления do/while.
многое из этого стало возможным благодаря [upvar] и [современные] команды, которые позволяют вам получить доступ к переменным или выполнить код в другом кадре стека.
IMHO самой большой скрытой особенностью Tcl является его C API. используя это, очень легко обернуть программу или подсистему core C и написать GUI или другую функциональность в Tcl. Хотя эта функция не уникальна для Tcl, Tcl был разработан, чтобы сделать это с нуля, и API C особенно прост в работе.
второй по величине скрытой особенностью является упаковщик, дедушка всех менеджеров геометрии. С этим, GUI может иметь sizeable окон с удивительно небольшим количеством кода. Важно отметить, что Tcl/Tk имел управление геометрией по крайней мере за 10 лет до выхода .net.
третьей величайшей особенностью Tcl является возможность расширения языка либо через API C, либо с помощью команд, определенных в Tcl. Не совсем макросы LISP, но тем не менее довольно гибкие. ожидал является очень хорошим примером приложения, построенного вокруг расширения языка Basse Tcl для создания домена язык сценариев.
EDIT: ну, черт меня побери, Xt действительно был менеджер геометрии, хотя я согласен с Nat в том, что это несколько более болезненно, чем pack ; -}
-
[array names]
является одним из первых вопросов, которые новички задают о том, как перебирать массив - кроме того, тот факт, что вы можете
foreach {key1 key2} {$list1 $list2} {...}
- даже если списки имеют разную размере - вы не должны использовать комментарии между случаями переключения (это не классная функция, но проблема, которую большинство разработчиков не понимают
- на
rename
команда может переименовать любую функцию / proc
Я думаю времени команда замечательная. Это не совсем скрыто, но это не мешает людям время от времени спрашивать "какая функция быстрее" в comp.ленг.язык Tcl.
в любое время вы хотите знать "сколько времени это занимает?"или "какой метод быстрее?- вы просто вызываете его с помощью команды "время". Нет создания объектов, нет математики, нет накладных расходов, исключительно просто. Другие языки имеют аналогичную функцию, хотя некоторые из них немного менее элегантны.
хорошо документированный C API также позволил легко интегрировать в Perl. Мой опыт работы с Tcl / Tk восходит к 1995 году, но в 2000 году я открыл Perl/Tk и никогда не оглядывался назад.
и в последнее время пакеты Tcl и Tkx Perl дают нам современные графические интерфейсы. И два вышеупомянутых модуля, хотя и не тривиальны, включают относительно небольшой код, учитывая, что они позволяют делать через языковые границы. И это может быть напрямую связано с отличным API (и сила Perl, очевидно).