我正在尝试创建一个proc跟踪方法。表示当脚本将使用任何proc时,它将打印其过程名称并继续。要做到这一点,我遵循这个方法
rename proc _proc
_proc proc {nm params body} {
eval "_proc $nm \{$params\} \{
puts \"Enter proc $nm\";
puts \"Parameters: $params and body \" ;
$body;
puts \"Exit proc $nm\"\}"
}
proc abc { param1 param2 param3 } {
puts "$param1 and $param2 and $param3"
}
当我呼叫proc abc
时,它正在输出
Enter proc abc
Parameters: param1 param2 param3 and body
a and b and c
Exit proc abc
问题:为什么这是印刷体,因为我的定义我只想打印参数
答案 0 :(得分:2)
这对我来说似乎过于复杂。让我们摆脱eval
并减少初学者的引用量。 (为简单起见,省略了其余的代码。)
_proc proc {nm params body} {
_proc $nm $params \
"[list puts "Enter proc $nm"];
[list puts "Parameters: $params and body "];
$body
[list puts "Exit proc $nm"]"
}
但那不完全是你想要的,不是吗?您想要打印实际参数而不是正式参数。这相当复杂。
_proc proc {nm params body} {
set cmd "[list puts "Enter proc $nm"];puts \"Parameters: "
foreach p $params {
append cmd "[lindex $p 0]=\$[lindex $p 0], "
}
append cmd " and body \";"
_proc $nm $params $cmd$body\;[list puts "Exit proc $nm"]
}
但是一旦你开始尝试从程序返回有意义的结果,即使这样也会出错。虽然您可以使用catch
和return
做一些可怕的事情来使其发挥作用(并且在8.5中更容易,而且使用8.6 try
更容易...... { {1}}),您想要一种不同的方法。你想要执行痕迹。
finally
如果我们尝试这样做,我们会看到非常信息输出,但我们并没有“打扰”该程序的工作:
% abc p d q Enter proc abc Parameters: param1=p, param2=d, param3=q, and body p and d and q Exit proc abc % info body abc puts "$param1 and $param2 and $param3"
答案 1 :(得分:0)