Если у вас Tcl 8.6+ и вы планируете перемоделировать свой скрипт поверх сопрограммы Tcl , вы можете реализовать это поведение продолжения в несколько строк.Это предполагает, что вы запускаете скрипт из интерактивной оболочки Tcl (dc shell?).
# script.tcl
if {[info procs allSteps] eq ""} {
# We are not re-entering (continuing), so start all over.
proc allSteps {args} {
yield; # do not run when defining the coroutine;
puts 1
puts 2
puts 3
yield; # step out, once first sequence of steps (1-10) has been executed
puts 4
puts 5
puts 6
rename allSteps ""; # self-clean, once the remainder of steps (11-N) have run
}
coroutine nextSteps allSteps
}
nextSteps; # run coroutine
- Упакуйте ваш скрипт в тело процедуры (
allSteps
). - В пределахтело процедуры: поместите
yield
, чтобы указать точку удержания / продолжения после ваших первых шагов (например, после 10-го шага). - Создайте сопрограмму
nextSteps
на основе allSteps
. - Защитите определения
proc
и coroutine
таким образом, чтобы они не вызывали повторное определение (когда выполняются шаги)
Затем запустите интерактивную оболочку и выполните source script.tcl
:
% source script.tcl
1
2
3
Теперь выполните ручную проверку.Затем продолжите в той же оболочке:
% source script.tcl
4
5
6
Обратите внимание, что вы можете запускать общую двухфазную последовательность любое количество раз (из-за самоочищения процедуры сопрограммы: rename
):
% source script.tcl
1
2
3
% source script.tcl
4
5
6
Еще раз: все это предполагает, что вы не выходите из оболочки и поддерживаете ее при выполнении обзора.Если вам необходимо выйти из оболочки по какой-либо причине (или вы не можете запустить Tcl 8.6+), то предложение Донала - это путь.
Обновление
Если применимо в вашем случае,Вы можете улучшить реализацию, используя анонимный (лямбда) proc .Это упрощает управление жизненным циклом (избегая переопределения, управления сопрограммами и процессами, нет необходимости в rename
):
# script.tcl
if {[info commands nextSteps] eq ""} {
# We are not re-entering (continuing), so start all over.
coroutine nextSteps apply {args {
yield; # do not run when defining the coroutine;
puts 1
puts 2
puts 3
yield; # step out, once first sequence of steps (1-10) has been executed
puts 4
puts 5
puts 6
}}
}
nextSteps