2012-04-11 51 views
2

我想要做的就是將一個參數作爲字符串解析爲一個沒有任何評估的字符串。 例如,如果我有一個平凡的PROC剛剛打印出它的參數:獲取未評估的tcl參數

proc test { args } { 
    puts "the args are $args" 
} 

我想要做的是把它叫做:

test [list [expr 1+1] [expr 2+2]] 

,而不是有TCL評估[list [expr 1+1] [expr 2+2]]。或者即使它評估 它我仍然想要有原始的命令行。因此,與瑣碎的「測試」 PROC上面我想能夠返回:

the args are [list [expr 1+1] [expr 2+2]]

這是可能的TCL 8.4?

回答

3

不能與Tcl的8.4(和之前執行此);語言設計使這不可能。解決方法是傳遞未評估的參數(並用大括號括起來)。然後,您可以打印它們,只要你喜歡。爲了得到他們的評估形式,你需要做的你的過程中:

set evaluated_x [uplevel 1 [list subst $unevaluated_x]] 

這是一個多有點亂!


如果您使用的Tcl 8.5,你就會有另一種選擇:

set calling_code [dict get [info frame -1] cmd] 

info frame -1得到一個辭典保持在調用當前程序方面的當前命令的說明,以及其cmd鍵是應用替換規則之前的實際命令字符串。這應該是關於你想要的(儘管要知道它包含命令名稱本身)。

這不適用於8.4,也不會被回溯。你可能想升級!

+0

謝謝。這是我所害怕的。 – user1327792 2012-04-12 00:17:42

+0

我非常肯定'信息框架'永遠不會回溯到8.4的原因是它需要很多侵入式機器來執行;它在已經非常複雜的領域爲Tcl的實施增加了很多複雜性。回港將會造成巨大的破壞。 – 2012-04-12 05:31:06

1

當通過參數到測試,enclose them in braces,例如: 測試{[列表[EXPR 1 + 1] [EXPR 2 + 2]]}

+0

謝謝。但是我忘了提及參數列表傳遞給我,我不能編輯arg來添加大括號。 – user1327792 2012-04-12 00:17:08