Странное поведение комментария tcl внутри блока if / else. Это ошибка интерпретатора tcl? - PullRequest
1 голос
/ 29 апреля 2011

Я поймал очень странную ошибку (?), Которая заняла у меня почти целый день, чтобы найти ее в реальном приложении.В коде был блок elseif, который был закомментирован, и это привело к выполнению кода, который (как я думал) никогда не мог быть выполнен.

Я упростил тестовый сценарий, который воспроизводит это странное поведение tcl.

proc funnyProc {value} {
  if {$value} {
    return "TRUE"
#  } elseif {[puts "COMMENT :)"] == ""} {
#    return "COMMENT"
  } else {
    return "FALSE"
  }
  return "IT'S IMPOSSIBLE!!!"
}

puts [funnyProc false]

Как вы думаете, что эта программа выведет?

  1. Выполнено puts в строке комментария.Это невозможно на любом языке программирования POV.
  2. Строка после блока if {...} {return} else {return} также выполняется.Это невозможно из логики true/false.

Я знаю, что tcl-comment ведет себя как команда с именем # и использует все аргументы до EOL.А tcl parser не любит несбалансированные фигурные скобки в комментариях.Но этот случай мне не понятен.

Может быть, я пропустил что-то важное?Как правильно закомментировать такие elseif блоки, чтобы не было этих странных побочных эффектов?

1 Ответ

6 голосов
/ 29 апреля 2011

Это потому, что # является только комментарием, когда Tcl ищет начало команды, и когда он впервые видит ее выше (при разборе if), он ищет } в порядкезакрыть ранее {.Это является следствием правил синтаксического анализа Tcl;if - это просто команда, а не специальная конструкция.

Эффект, отмеченный Эрнестом, заключается в том, что он увеличивает уровень вложенности фигурных скобок в этой строке, что делает его частью аргумента, который начинается с концаот линии if {$value} { до начала строки } else {.Тогда # становится особенным, когда if оценивает скрипт.(Ну, за исключением того, что все это скомпилировано байт-кодом, но это деталь реализации: наблюдаемая семантика та же самая, за исключением некоторых действительно неприятных крайних случаев.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...