在打印proc的参数时遇到问题

时间:2014-05-28 09:08:42

标签: tcl

我正在尝试创建一个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

问题:为什么这是印刷体,因为我的定义我只想打印参数

2 个答案:

答案 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"]
}

但是一旦你开始尝试从程序返回有意义的结果,即使这样也会出错。虽然您可以使用catchreturn做一些可怕的事情来使其发挥作用(并且在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)

有许多方法可以编写proc命令的替换,以允许注入跟踪和内省功能。但是,最好的方法是使用trace命令将跟踪挂钩附加到过程,并让这些挂钩调用info命令列出参数列表,过程体等内容。