tcl:info frame给出了与info body不匹配的行号

时间:2013-04-27 09:40:59

标签: tcl

请参阅以下示例:

$tclsh
% proc test {} {
    puts "line 2: [info frame 0]"
    # line 3 \ 
    line 4
    puts "line 5: [info frame 0]"
}
% test
line 2: type proc line 2 cmd {info frame 0} proc ::test level 0
line 5: type proc line 5 cmd {info frame 0} proc ::test level 0
% info body test

puts "line 2: [info frame 0]"
# line 3 line 4
puts "line 5: [info frame 0]"

第二个info frame给出第5行是合理的 但它位于info body返回的字符串的第4行(因为\被删除,第3行和第4行连接在一起。)
是否可以使info frameinfo body之间的行号保持一致?

1 个答案:

答案 0 :(得分:0)

info frame命令显然很奇怪;它尝试从代码生成的地方返回行号。如果您将代码放在一个文件中,line字段将是该文件中的行号 (将在file字段中命名,该字段在代码中出现是source d)。这是来自终端会话的示例cut-n-paste,显示真实值:

bash$ cat test_frame.tcl 
package require Tcl 8.5
proc test {} {
    puts "line 2: [info frame 0]"
    # line 3 \
    line 4
    puts "line 5: [info frame 0]"
}
test
bash$ tclsh test_frame.tcl
line 2: type source line 3 file /home/dkf/test_frame.tcl cmd {info frame 0} proc ::test level 0
line 5: type source line 6 file /home/dkf/test_frame.tcl cmd {info frame 0} proc ::test level 0

现在我知道这是令人恼火的,你不能将行号与info body结果同步,但获取文件行号(好吧,可能)更有用。

(尽管如此,我希望我们在errorInfo跟踪消息中使用此信息;我们需要进行大量工作来构建它,然后几乎不做任何事情......)