Подстановка строк с использованием API tcl
Вопрос
Есть ли способ (ab) использовать tcl C-API, чтобы «проанализировать» строку, выполнив все замены (включая подкоманды в квадратных скобках), но остановившись перед фактической оценкой полученной командной строки?
То, что я пытаюсь сделать, - это создать команду (в C, но я рассмотрю возможность сделать tcl-обертку, если есть элегантный способ сделать это там), которая принимает блок в качестве параметра (т.е. curly- брекет-кавычки строки). Я хотел бы взять этот блок, разделить его и выполнить замены таким же образом, как если бы он должен был быть выполнен, но остановимся на этом и интерпретируем получающиеся строки вместо этого.
Я подумал о создании пространства имен, где все действительные первые слова определены как команды, однако этот список настолько обширный (и в значительной степени динамический), что быстро становится слишком громоздким. Я также попробовал этот подход, но с помощью команды unknown
для перехвата различных команд. Тем не менее, unknown
используется для множества вещей и не может быть привязан к пространству имен, поэтому мне придется определять его всякий раз, когда я выполняю блок, и возвращать его тем, что было раньше, когда Я сделал, что кажется довольно шатким. Кроме того, я бы столкнулся с риском (довольно низким, но не нулевым) столкновения с реальной командой, поэтому я бы предпочел не использовать команду unknown
.
Самое близкое, что я могу получить, это Tcl_ParseCommand
(и остальная часть семейства), который создает дерево разбора, которое я мог бы оценить вручную. Думаю, я прибегну к этому, если не найдется лучшего решения, но я бы, конечно, предпочел бы, если бы был «официальный» путь.
Я что-то упустил?
Решение
Посмотрите Tcl_SubstObj . Это эквивалент C команды [subst], которая, похоже, и является тем, что вы ищете.
Как вы указали в своем комментарии, subst не совсем делает то, что вы ищете. Если это поможет, вам может понадобиться следующий код Tcl:
> set mydata {mylist item $listitem group item {$group item}}
> set listitem {1 2 3}
> subst $mydata ;# error: can't read "group": no such variable
> proc groupsubst {data} {
return [uplevel 1 list $data]
}
> groupsubst $mydata ;# mylist item {1 2 3} group item {$group item}