定義函數如何添加某種幫助用戶定義的函數在TCL添加幫助用戶在TCL
假設,如果我有一個函數調用的runTest {IP_ADDRESS test_time}, 如何描述什麼測試或程序是關於TCL_shell?
如何指定信息給用戶,如果他在TCL shell中鍵入function_name --help,用戶應該能夠知道函數做了什麼以及參數究竟是什麼。
我該怎麼做?
定義函數如何添加某種幫助用戶定義的函數在TCL添加幫助用戶在TCL
假設,如果我有一個函數調用的runTest {IP_ADDRESS test_time}, 如何描述什麼測試或程序是關於TCL_shell?
如何指定信息給用戶,如果他在TCL shell中鍵入function_name --help,用戶應該能夠知道函數做了什麼以及參數究竟是什麼。
我該怎麼做?
儘管它不屬於語言的一部分,但實現將此功能添加到預先存在的功能的事情是相當容易的。唯一需要注意的是該函數不能將字符串--help
作爲有效參數,因爲該參數將觸發該功能。
這裏有一個簡單的實現:
# Lets call the feature "document". As in, add documentation:
proc document {procname text} {
rename $procname __$procname
proc $procname args [string map [list %TEXT% $text %PROC% $procname] {
if {$args == "--help"} {
puts {%TEXT%}
} else {
set script [linsert $args 0 __%PROC%]
return [uplevel 1 $script]
}
}]
}
這樣做是重寫功能(通過重命名,然後宣佈同名的另一個功能),看看函數調用的參數--help
。如果是,則打印文檔,否則執行原始功能。只是要小心,不要在同一個函數上調用兩次(可以修改它以使其工作)。
像這樣,你可以做的事情:
proc foo {} {puts 2}
document foo {Prints the number 2.}
現在,如果你撥打:
foo --help
,它會輸出:
Prints the number 2.
不重新定義proc
命令,你不能。也就是說,該功能不是內置於語言中的,但如果您願意,可以添加。
我會注意到,儘可能地自己添加功能可能超出了值得做的難度,特別是對於不熟悉該語言的人。話雖如此,你可以檢查tclers wiki已有的實現。
我更願意把幫助一個單獨的文件(例如HTML),讓我可以在另一個窗口中瀏覽它。有很多方法可以做到這一點,同時仍然保留文檔的代碼,例如通過doxygen。
也有很多做交互式文檔的方法,其中有幾種方法在the Tcler's Wiki中有描述;在我看來,在該頁面上提到的一些技術(連同@ slebetman的答案)會給你你想要的。 (我認爲這將是更容易有一個單獨的help
命令,因爲這將避免在幫助語法與命令干擾,但這是你的電話。)
您不必觸碰現有程序:
proc help {procname} {
puts $::helptext($procname)
}
proc addhelp {procname text} {
set ::helptext($procname) $text
}
addhelp foo "this is the help text for procedure foo"
help foo
+1這是一個更清潔的實現,接近我們在工作中使用的東西。 – 2012-02-28 16:23:44
我可以看到一些改進,例如檢查某個過程是否存在,拔出過程的參數列表等。 – 2012-02-28 18:22:49
此代碼實際上並沒有工作,你能否讓我知道它是否工作? – amateur 2012-02-28 07:12:06
應該工作。在發佈之前先在我的機器上進行測試。你使用的是什麼tcl版本? – slebetman 2012-02-28 07:23:56
'return [uplevel 1 [list __%PROC%{*} $ args]]'會更好,因爲這可以讓proc認爲它不被包裝。或者在8.6中「tailcall __%PROC%{*} $ args」。 – 2012-02-28 09:45:29