2012-02-28 42 views
1

定義函數如何添加某種幫助用戶定義的函數在TCL添加幫助用戶在TCL

假設,如果我有一個函數調用的runTest {IP_ADDRESS test_time}, 如何描述什麼測試或程序是關於TCL_shell?

如何指定信息給用戶,如果他在TCL shell中鍵入function_name --help,用戶應該能夠知道函數做了什麼以及參數究竟是什麼。

我該怎麼做?

回答

1

儘管它不屬於語言的一部分,但實現將此功能添加到預先存在的功能的事情是相當容易的。唯一需要注意的是該函數不能將字符串--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. 
+0

此代碼實際上並沒有工作,你能否讓我知道它是否工作? – amateur 2012-02-28 07:12:06

+0

應該工作。在發佈之前先在我的機器上進行測試。你使用的是什麼tcl版本? – slebetman 2012-02-28 07:23:56

+2

'return [uplevel 1 [list __%PROC%{*} $ args]]'會更好,因爲這可以讓proc認爲它不被包裝。或者在8.6中「tailcall __%PROC%{*} $ args」。 – 2012-02-28 09:45:29

0

不重新定義proc命令,你不能。也就是說,該功能不是內置於語言中的,但如果您願意,可以添加。

我會注意到,儘可能地自己添加功能可能超出了值得做的難度,特別是對於不熟悉該語言的人。話雖如此,你可以檢查tclers wiki已有的實現。

0

我更願意把幫助一個單獨的文件(例如HTML),讓我可以在另一個窗口中瀏覽它。有很多方法可以做到這一點,同時仍然保留文檔的代碼,例如通過doxygen

也有很多做交互式文檔的方法,其中有幾種方法在the Tcler's Wiki中有描述;在我看來,在該頁面上提到的一些技術(連同@ slebetman的答案)會給你你想要的。 (我認爲這將是更容易有一個單獨的help命令,因爲這將避免在幫助語法與命令干擾,但這是你的電話。)

1

您不必觸碰現有程序:

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 
+0

+1這是一個更清潔的實現,接近我們在工作中使用的東西。 – 2012-02-28 16:23:44

+0

我可以看到一些改進,例如檢查某個過程是否存在,拔出過程的參數列表等。 – 2012-02-28 18:22:49