Хотя верно, что он не является частью языка, довольно просто реализовать что-то, что добавляет эту функциональность к уже существующим функциям. Единственное предостережение в том, что функция тогда не может взять строку --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.
этот код на самом деле не работал, не могли бы вы сообщить мне, если он работает ??? – amateur
Должен работать. Протестируйте его на моей машине, прежде чем публиковать его здесь.Какую версию tcl вы используете? – slebetman
Было бы лучше с 'return [uplevel 1 [list __% PROC% {*} $ args]]', поскольку это позволяет proc считать, что он не завернут. Или 'tailcall __% PROC% {*} $ args' в 8.6. –