无法放入tcl脚本

时间:2014-09-22 07:09:18

标签: tcl

我正在尝试在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

中给出错误

1 个答案:

答案 0 :(得分:3)

如果你发布的内容是正确的,问题是你没有使用正确的引用字符。

Tcl只能理解两种引用:

  1. 引用替换:""
  2. 引用无替换:{}
  3. tcl中的字符将被视为任何其他字符,例如a5

    请注意,在没有引用的情况下,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需要一个或两个参数。