Теперь переименуйте другие команды, которые стоит переименовать, например
& regsub R
& string S
& while W
Команду стоит переименовать, если, учитывая ее длину n и вхождения k , k (n-1) - (n + 4)> 0 . Решая для к , формула становится k > (n+4)/(n-1)
. Вот справочная таблица, которая позволяет легко:
length of minimum example(s)
command occurrences
------------------------------------------------
2 6 if (consider renaming to "?")
3 4 for, set (consider renaming to "=")
4 3 eval, expr, incr (consider renaming to "+"), info, join, proc, puts, scan
5 3 break, catch, lsort, split, subst, trace, unset, while
6 3 format, lindex, lrange, regexp, regsub, rename, return, string, switch
7 2 foreach, lappend, linsert, llength, lsearch, unknown
. 2 lreplace
. 2 continue
. 2
Для более крупных программ вот трюк, о котором я подумал, но еще не применил:
proc unknown {c args} {eval [info commands $c*] $args}
Это эмулирует интерактивные сокращения команд! Это стоит 54 символов, но теперь вы можете использовать j
для join
, sp
для split
, st
для string
, w
для while
, и так далее.
info script {};set tcl_interactive 1
unknown
маршруте: смотрите здесь и здесь .еще не является обязательным
Как сказано на странице справочника ,
else
подразумевается вif
блочных конструкциях. Так что жеif ... {} else {}
может стать
if ... {} {}
как вы можете видеть на некоторых из моих ответов.
источник
Может быть, это должно быть интегрировано в другой ответ, но здесь это идет:
Когда a
proc
имеет только один параметр, он может быть записан каквместо того
То же самое относится к двум параметрам,
proc
использующим обратную косую черту; это можно записать каквместо того
Для большего количества параметров
{}
рендер короче код.источник
Иногда стоит заменить два
set
оператора для объединения строк только однимlappend
оператором. На конструкции, как, можно заменитьпо
Команда
append
имеетincr
похожее поведение, которое инициализирует еще не определенную переменную.Позаботьтесь , чтобы не ошибка
append
поlappend
источник
Если вы обрабатываете список с помощью операции, синтаксически чередующейся между каждым элементом, иногда вы можете использовать
join
элементы для выполнения определенной операции вместо ее обхода.На /codegolf//a/127042/29325 есть пример:
Это
read stdin
даст,23 214 52
тогда раскол даст список{23 214 52}
. После,[join {23 214 52} +]
вернет строку23+214+52
. Наконец-expr 23+214+52
то работа по подведению итоговисточник
split
.Если у вас есть большие коды, можно избежать множества обычаев ,
expr
используяnamespace pat tcl::mathop
в самом начале. Он предоставляет префиксно-синтаксическую операцию как обычную функцию Tcl. Например:Смотрите официальную страницу документации Mathop
источник
Когда у вас есть несколько переменных, которые были
set
в последующих строках, вы можете использовать однуlassign
вместо несколькихset
инструкций для достижения того же эффекта.Одним из примеров является мой собственный ответ /codegolf//a/105789/29325
Чтобы принять решение, нужно просто взвесить количество переменных (при условии, что переменные состоят из одной буквы, как это и ожидается при игре в гольф):
<5,
set
игрок в гольф= 5,
set
иlassign
сгенерировать тот же счетчик байтов> 5,
lassign
это игрок в гольфисточник