Цитата в скобках: все ли буквально в скобках?
Я прочитал это, все буквально внутри скобки {}
(кроме обратной косой черты в Tcl. Итак, это ожидается:
% puts {\{}
\{
Однако я не правильно понимаю следующее:
% puts { {}
<waits for close brace>
Я ожидал бы, что это напечатает {
, поскольку он находится внутри фигурных скобок и должен восприниматься буквально. Я ожидаю, что когда вы встретите открытую скобку, воспринимайте все буквально, пока не встретите первую закрывающую скобку. Но, похоже, этого не происходит. Пожалуйста, очистите мое недоразумение.
2 ответа
Брекеты гнездятся (если не указаны) в скобках, потому что это правило ([6] в Dodekalogue). Причиной этого правила является то, что содержимое слова в скобках очень часто является структурированным выражением с несколькими открытыми и закрытыми скобками, вполне возможно, даже с несколькими уровнями открытых и закрытых скобок. Преимущество жалобы синтаксического анализатора на несбалансированные скобки перевешивает необходимость заключать их в кавычки, когда вы не используете их для структурирования выражения.
Брекеты - это всегда кошмар на попрошайничестве Tcl
программист.
Как вы уже знаете, основное правило большого пальца с фигурными скобками выглядит следующим образом:
Правило 1: внутри скобок не происходит никаких замен
Помимо приведенного выше правила, у нас есть немного больше в Tcl
,
Одним из наиболее важных видов использования брекетов является defer evaluation
,
Правило 2: отложенная оценка
Это означает, что специальные символы не обрабатываются немедленно Tcl
синтаксический анализатор.
Вместо этого они будут переданы в командную процедуру как часть ее аргумента, и командная процедура сама обработает специальные символы. Скобки почти всегда используются при передаче скриптов Tcl
команды, как в следующем примере, который вычисляет факториал из пяти:
set result 1
set i 5
while {$i > 0} {
set result [expr $result*$i]
set i [expr $i-1]
}
Тело while
цикл заключен в фигурные скобки, чтобы отложить замены. While
передает сценарий обратно в Tcl
для оценки во время каждой итерации цикла и замены будут выполняться в это время. В этом случае важно отложить подстановки так, чтобы они выполнялись заново каждый раз, когда время вычисляет тело цикла, а не раз и навсегда при синтаксическом анализе команды while.
Правило 3: Гнездо брекетов. Последнее слово proc
Команда начинается после открывающей скобки в первой строке и содержит все, вплоть до закрывающей скобки в последней строке.
Правило 4: интерпретатор Tcl удаляет внешние скобки и передает все между ними, включая несколько вложенных пар скобок, proc
в качестве аргумента.
proc power {base p} {
set result 1
while {$p > 0} {
set result [expr $result*base]
set p [expr $p-1]
}
return $result
}
В приведенном выше случае третий аргумент proc
содержит две пары вложенных скобок (самые внешние скобки удаляются Tcl
синтаксический анализатор). Подстановка команды, запрошенная с [expr $p-1]
не будет выполняться, когда proc
команда анализируется, или даже когда while
команда анализируется как часть выполнения тела процедуры, но только когда while
оценивает свой второй аргумент для выполнения цикла.
Правило 5: Если фигурная скобка имеет обратную косую черту, то она не считается завершением соответствующей закрывающей фигурной скобки для слова, заключенного в фигурные скобки. Обратная косая черта не будет удалена при разборе слова.
Как объясняется в правиле 4, в коде puts {\{}
после снятия внешних скобок имеем \{
в одиночестве. Это будет передано puts
команда. Теперь, согласно правилу 5, в \{
, когда Tcl
наталкивается на открытую фигурную скобку с отступом, она не будет пытаться сопоставить закрывающую фигурную скобку. Кроме того, этот обратный слеш не будет удален при анализе. Вот почему \{
печатается в консоли.
В случае puts {{}
интерпретатор Tcl, очевидно, будет ждать закрывающих скобок, поскольку он не сбалансирован.
Примечание: будет исключение во всех местах. Что ж, Tcl
имеет то же самое, когда дело доходит до брекетов. Мы начали говорить "Никакой замены внутри фигурных скобок". Но единственная форма замещения между скобками - это обратный слэш-перевод строки.
В Tcl
, backslash
также используется для продолжения строки.
if 1 {
puts "Brace Yourself!!!"
}
Вы можете переписать вышеизложенное как
if 1 \
{
puts "Brace Yourself!!!"
}
Таким же образом, с обратной косой чертой-новой строкой, замена будет происходить, как показано ниже.
puts {Thanks to\
Stackru}
Вывод кода будет отображаться в одной строке.
Ссылка: Tcl и Tk Toolkit