Цитата в скобках: все ли буквально в скобках?

Я прочитал это, все буквально внутри скобки {} (кроме обратной косой черты в Tcl. Итак, это ожидается:

% puts {\{}
\{

Однако я не правильно понимаю следующее:

% puts { {}
 <waits for close brace>

Я ожидал бы, что это напечатает {, поскольку он находится внутри фигурных скобок и должен восприниматься буквально. Я ожидаю, что когда вы встретите открытую скобку, воспринимайте все буквально, пока не встретите первую закрывающую скобку. Но, похоже, этого не происходит. Пожалуйста, очистите мое недоразумение.

2 ответа

Решение

Брекеты гнездятся (если не указаны) в скобках, потому что это правило ([6] в Dodekalogue). Причиной этого правила является то, что содержимое слова в скобках очень часто является структурированным выражением с несколькими открытыми и закрытыми скобками, вполне возможно, даже с несколькими уровнями открытых и закрытых скобок. Преимущество жалобы синтаксического анализатора на несбалансированные скобки перевешивает необходимость заключать их в кавычки, когда вы не используете их для структурирования выражения.

Синтаксис Tcl

Брекеты - это всегда кошмар на попрошайничестве 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

Другие вопросы по тегам