我正在尝试在tcl中创建一个跟踪函数.Function将列出所有被调用的proc /嵌套调用和参数。以下是脚本
rename proc _proc
proc proc {nm params body} {
_proc $nm $params $body
trace add execution $nm enter [list track_entry $nm $params]
trace add execution $nm leave [list track_leave $nm]
}
_proc track_entry {nm params real args} {
puts "Enter proc $nm"
foreach formal $params actual [lrange $real 1 end] {
append p " [lindex $formal 0]=$actual,"
}
puts "Parameters:$p and body"
}
_proc track_leave {nm args} {
puts "Exit proc $nm"
}
proc test1 { param1 param2 } {
puts “parameters are $param1 and $param2”
test2 value1
}
proc test2 { value} {
puts “value is $value”
}
我的输出低于输出
test1 arg1 arg2
Enter proc test1
Parameters: param1=arg1, param2=arg2, and body
Exit proc test1
wrong # args: should be "puts ?-nonewline? ?channelId? string"
任何线索,为什么它会在puts
答案 0 :(得分:3)
如果你发布的内容是正确的,问题是你没有使用正确的引用字符。
Tcl只能理解两种引用:
""
{}
tcl中的字符“
将被视为任何其他字符,例如a
或5
。
请注意,在没有引用的情况下,tcl将该单词视为不带空格的字符串。例如,以下示例都是有效的字符串:
this_is_a_valid_string
"this_is_a_valid_string"
{this_is_a_valid_string}
遵循这个简单的规则,以下也是有效的字符串,并且都是等效的:
“hello
"“hello"
{“hello}
所以当你要求tcl执行以下内容时:
puts “parameters are $param1 and $param2”
它将其视为:
puts {“parameters} {are} "$param1" {and} "$param2”"
将5个参数传递给puts
。
显然这会触发错误,因为puts需要一个或两个参数。