По сути, проблема состоит в том, чтобы выполнить код Tcl, определенный в одном пространстве имен, используя вызовы функций в этом пространстве имен, в eval внутри другого пространства имен.
Следующий код работает нормально:
namespace eval ::eggs {
namespace export e1 eeval
proc e1 {} { puts pe1 }
proc eeval body { puts "in cb enter"; eval $body; puts "in cb exit" }
}
namespace import ::eggs::*
namespace eval ::spam {
namespace export s1 scall
proc scb {} { puts pscb }
proc scall {} { puts "in call enter"; eeval {::spam::scb}; puts "in call exit" }
e1
scall
}
namespace import ::spam::*
и отпечатки:
% % % % % % pe1
in call enter
in cb enter
pscb
in cb exit
in call exit
Теперь я хочу заменить ::spam::scb
на scb
. Я бы обменял упаковку на eeval
.
Мой вариант использования:
Пространство имен eggs
- это очень простая библиотека для регрессионного тестирования. Пространство имен spam
- это небольшая библиотека, в которой реализована хорошая функция. Они должны быть проверены после перезагрузки. Для этого вызывается scall
и используется специальная тестовая функция в eggs
с именем eeval
.
eeval - это модульный тест. Из соображений удобства и «не повторяй себя» я бы не хотел использовать полное имя пространства имен для любой функции, определенной в spam
.
В идеале scall
будет выглядеть так:
proc scall {} { puts "in call enter"; eeval {scb}; puts "in call exit" }
Однако во время выполнения eval в ::eggs::eeval
не знает, где найти scb
. Поскольку eggs
- это просто библиотека тестов, я не могу импортировать пространство имен spam
.
Есть ли способ, например, можно разработать обертку, например eeval
чтобы запустить его в другом пространстве имен?