2012-02-28 3 views
1

, как я могу добавить какую-либо помощь в определенных пользовательских функций в TCLДобавление помощи пользователю определенные функции в TCL

Предположив, если у меня есть функция, называемая RunTest {ip_address test_time}, Как описать то, тест или процедура происходит в TCL_shell?

Как я могу указать информацию пользователю, если он вводит имя_функции --help в оболочке TCL, пользователь должен знать, что делает функция и каковы именно параметры.

как я могу это сделать?

ответ

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

+0

Должен работать. Протестируйте его на моей машине, прежде чем публиковать его здесь.Какую версию tcl вы используете? – slebetman

+2

Было бы лучше с 'return [uplevel 1 [list __% PROC% {*} $ args]]', поскольку это позволяет proc считать, что он не завернут. Или 'tailcall __% PROC% {*} $ args' в 8.6. –

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 Это более чистая реализация и близкая к тому, что мы используем на работе. –

+0

Я вижу улучшения, такие как проверка того, что процедура фактически существует, вытягивание списка аргументов для proc и т. Д. –