proc printProc {procName} {
set result [list proc $procName]
set formals {}
foreach var [info args $procName] {
if {[info default $procName $var def]} {
lappend formals [list $var $def]
} else {
# Still need the list-quoting because variable
# names may properly contain spaces.
lappend formals [list $var]
}
}
puts [lappend result $formals [info body $procName]]
}
所以我們可以很容易的知道 proc 參數和函式文字內容的資訊。也就是說,我們可以使用 info command 來拿到某個函式的內容(也就是使用 info body $procname 來拿到),並且使用 eval 執行之。
下面是一些練習的嘗試:
proc hello {x} {
puts $x
}
proc rand {x} {
set num [expr rand()]
return [expr $num * $x]
}
proc hello2 {procname x} {
if {[string compare "hello" $procname]==0} {
incr x
}
eval [info body $procname]
}
hello2 hello 3
hello2 rand 10
很神奇吧?雖然我不知道有什麼用處,但是可以直接拿別的 proc 的 function body 來執行,對我而言是很神奇的。