Как вставить буквенные слова в Tcl - PullRequest
0 голосов
/ 08 марта 2020

Существует ли какая-либо синтаксическая уловка / функция, которая позволила бы мне вставить два буквальных слова в TCL, например, чтобы объединить в скобках ({..}) слово и двойные кавычки "...") в один?

Я не спрашиваю о set a {foo}; set b "bar\nquux"; set c $a$b или append a $b - я знаю о них; но о чем-то без промежуточных переменных или команд. По аналогии с {*}word (который превращает слово в список).

Полагаю, что ответ «нет пути», но мое поверхностное знание Tcl не позволяет мне сделать такой вывод.

Ответы [ 3 ]

2 голосов
/ 08 марта 2020

Если вы используете последнюю версию Tcl (8.6.2 или новее), вы можете использовать

set c [string cat {foo} "bar\nquux"]

Для более старых версий вы можете прибегнуть к

set c [format %s%s {foo} "bar\nquux"]
0 голосов
/ 09 марта 2020

Нет способа сделать то, что вы просите, без команды, так как синтаксис скобочных слов ничего не разрешает ни до, ни после, и когда у вас есть несколько слов, вам нужно присоединить их к команде (потому что это что команды делают с точки зрения языкового ядра Tcl; принимают некоторые значения и дают результат значения). Нельзя сказать, что наличие скобок в середине строки является синтаксической ошибкой - это не так - но это мешает им быть символами кавычек. Для ясности:

  1. puts a{b} печатает a{b}, потому что { является не особенным в этом случае и вместо этого становится частью значения.
  2. puts {a}b - синтаксическая ошибка. (Исключением * является {*}, которое начиналось как {expand}, но это было waaaay слишком многословно.)

Подходит к этой работе:

  • Использовать string cat.
  • Использовать процедуру конкатенации (например, proc strcat {a b} {return $a$b}
  • Поместить оба значения в фигурные скобки, чтобы это был объединенный литерал. конечно, работает, только если обе части являются литералами.
  • Преобразование фигурной части в форму без скобок (и без двойных кавычек). всегда возможно, так как каждая фигурная скобка строка имеет эквивалент без скобок, но может включать много обратных косых черт.
0 голосов
/ 08 марта 2020

Если ваше слово является действительным списком, вы можете сделать:

set orig {abc def}
set new [join $orig {}]
...