Подстановка строк с использованием API tcl

StackOverflow https://stackoverflow.com/questions/1602076

  •  05-07-2019
  •  | 
  •  

Вопрос

Есть ли способ (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}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top