Ответ 1
Когда маркетинговый парень в Sun заявил, что Tcl был "Enterprise Ready", разработчики добавили следующую функцию:
$ tclsh
% clock format [clock seconds] -format %Q
Stardate 63473.2
Я работал с TCL/TK, недавно начал использовать TCL/TK с моими приложениями автоматизации, и я жажду знаний.
Чтобы продолжить длинную строку вопросов с скрытыми функциями, я хотел бы знать любые скрытые или удобные функции TCL/TK или любой простой метод для достижения больших операций
Когда маркетинговый парень в Sun заявил, что Tcl был "Enterprise Ready", разработчики добавили следующую функцию:
$ tclsh
% clock format [clock seconds] -format %Q
Stardate 63473.2
Моей любимой "скрытой или удобной функцией" является то, как цитирование работает в Tcl. Мне нравится использовать фразу "quoting - это инструмент, а не правило". Я также хочу сказать: "вам нужны только фигурные скобки, когда вам нужны фигурные скобки"
В то время как на большинстве языков есть правила, для которых разделители блоков должны использоваться для определенных вещей (например, в 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 по строкам "если я делаю" это {и $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 на Радикальное изменение языка
Команда Tcl [trace] позволяет перехватывать чтения и записи любой переменной. Это позволяет реализовать наблюдателя по любой переменной и добавлять автоматическую проверку диапазона произвольной сложности к любой переменной (как если бы вы обращались к переменной через сеттер/получатель). Вы также можете создавать автоматически увеличивающиеся переменные, используя эту технику.
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, включая структуры управления, такие как [для], [foreach], [while] и т.д. Это означает, что вы можете расширить язык, написав новые структуры управления в чистом Tcl-коде.
Например, структура try/on/trap была реализована в Tcl 8.6a, используя только код Tcl. Аналогично tcllib содержит control:: do, структуру управления do/while.
Многое из этого стало возможным благодаря командам [upvar] и [uplevel], которые позволяют вам обращаться к переменным или выполнять код в другом стеке стека.
IMHO самой большой скрытой особенностью Tcl является ее C API. Используя это, очень легко обернуть основную программу или подсистему C и написать графический интерфейс или другие функции в Tcl. Хотя эта функция не уникальна для Tcl, Tcl был разработан для этого с нуля, и C API особенно прост в работе.
Вторая самая большая скрытая особенность - упаковщик, гранд-папа всех менеджеров геометрии. При этом графический интерфейс может иметь значительные окна с удивительно небольшим количеством кода. Важно отметить, что Tcl/Tk управляет геометрией не менее 10 лет до того, как .net вышел.
Третьей особенностью Tcl является возможность расширения языка либо через API C, либо с помощью команд, определенных в Tcl. Не совсем LISP макросы, но довольно гибкие, тем не менее. Expect - очень хороший пример приложения, созданного вокруг расширения базового языка Tcl для создания языка сценариев, специфичных для домена.
РЕДАКТИРОВАТЬ: хорошо, мне сложно, Xt действительно имел геометрический менеджер, хотя я согласен с Nat в том, что это несколько больнее, чем pack; -}
[array names]
- один из первых вопросов, которые новички задают о том, как перебирать массивforeach {key1 key2} {$list1 $list2} {...}
- даже если списки имеют разный размерrename
может переименовать любую функцию /proc Я думаю, что команда time замечательна. Это не совсем скрыто, но это не мешает людям спрашивать "какая функция быстрее" в comp.lang.tcl.
В любое время, когда вы хотите узнать, сколько времени это займет? или "какой метод быстрее?" вы просто вызываете его через команду "время". Нет создания объектов, нет математики, нет накладных расходов, исключительно просто. Другие языки имеют аналогичную функцию, хотя некоторые из них немного менее элегантны.
Хорошо документированный API C также позволил легко интегрировать в Perl. Мой опыт работы с Tcl/Tk восходит к 1995 году, но в 2000 году я обнаружил Perl/Tk и никогда не оглядывался назад.
И в последнее время пакеты Tcl и Tkx Perl дают нам современный графический интерфейс. И два вышеупомянутых модуля, хотя и не тривиальные, содержат относительно небольшой код, учитывая то, что они позволяют делать через границы языка. И это может быть напрямую связано с превосходным API (и, очевидно, с мощью Perl).