Распечатать выражение, содержащее список переменных в контексте вызывающего - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь реализовать регистратор команд в TCL, где каждая команда оборачивается отпечатками и выполняется в контексте вызывающего.

Метод также должен расширять переменные, которые ссылаются на списки или список списков, добавляя ключевое слово list в нужных местах.

Например:

proc exec_cmd {cmd} {
   uplevel puts \"$cmd\"
   uplevel $cmd
}

proc somefunc {inlist1 inlist2} {
...
}

set x [list "P" "Q" "R"]
set y [list [list "A" "B"] [list "X" "Y"]]
exec_cmd {somefunc $x $y}

В приведенном выше примере я хочу, чтобы регистратор печатал [list P Q R] и [list [list A B] [list [X Y]] вместо $x и $y

Как я могу это сделать?

Это то, что я пробовал до сих пор, но это не работает так, как я хочу:

proc exec_cmd {cmd} {
    set stripped [string map {\" {} [ \[ ] \]} $cmd]
    uplevel puts \"$stripped\"
    uplevel $cmd
}

Для приведенного выше примера,вывод, который я получаю:

somefunc P Q R {A B} {X Y}

Но то, что я хочу, это:

somefunc [list P Q R] [list [list A B] [list X Y]]

1 Ответ

0 голосов
/ 07 ноября 2019

Метод также должен расширять переменные, которые ссылаются на списки или списки списков, добавляя ключевое слово list в нужных местах.

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

Я пытаюсь реализовать регистратор команд в TCL

Рассматривали ли вы какой-то встроенный механизм для настройкиожидания и / или основывать свою реализацию на вершине? Трассировки выполнения покажет вам, что вы можете ожидать от точки зрения регистратора:

% proc report args {puts [info level 0]}
% trace add execution somefunc enter report
% somefunc $x $y
report {somefunc {P Q R} {{A B} {X Y}}} enter

Реализуйте это самостоятельно, выполнимо, но утомительно (например, вы должны убедиться, чтовы не создаете побочных эффектов при упреждающей оценке команд при предварительной обработке аргумента перехваченной команды).

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