2012-09-23

proc body and args

考慮下面 Tcl 文件裡的示範:
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 來執行,對我而言是很神奇的。

沒有留言: