2014-09-22 95 views
0

我想在tcl中創建一個跟蹤函數。函數將列出所有被調用的procs/nested調用和那裏的參數。下面是腳本無法放入tcl腳本

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

+4

爲什麼你在最後兩個'proc's引號(''「'')而不是簡單引號('」「')中引用了? – Jerry 2014-09-22 07:38:45

回答

3

前提是你貼什麼是正確的給錯誤,問題是你不使用正確的引號字符。

的Tcl既懂2種引用的:

  1. 具有取代報價:""
  2. 沒有取代的報價:{}

字符在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需要一個或兩個參數。