Скрипт Tcl: неверное имя команды возвращается при выполнении тела процедуры
В сценарии Tcl я хочу отследить возврат процесса Tcl, чтобы выполнить некоторые действия завершения. Например, мой код может быть следующим:
proc X10 { a } { return [expr $a * 10] }
proc procF {} {
set a 13
catch {[info body X10]} __result
return $__result
}
procF
Предыдущий код дает мне ошибку: invalid command name " return [expr $a * 10] "
Хотя это замена info body X10
с return [expr $a * 10]
работает как положено. Сначала я подумал, что они оба взаимозаменяемы и должны давать одинаковый результат. Итак, почему первый дает ошибку и в чем разница между ними обоими?
1 ответ
Ваш код не работает, потому что вы получаете тело X10
и рассматривая это как имя команды. Tcl не делит вещи автоматически для вас - вы должны попросить об этом - и это важный фактор безопасности языка. Вы должны сделать что-то вроде этого:
proc procF {} {
set a 13
catch {eval [info body X10]} __result
return __result
}
или это (потому что первый аргумент catch
это скрипт)
proc procF {} {
set a 13
catch [info body X10] __result
return __result
}
Но я бы на самом деле был склонен в вашем случае (как это было представлено, и пытаться интерпретировать то, что вы сказали) сделать:
proc procF {} {
set a 13
catch {X10 $a} __result
return __result
}
Обратите внимание, что если вы сделали это:
proc procF {} {
set a 13
catch {info body X10} __result
return __result
}
тогда результатом будет определение X10
без оценки.