Скрипт 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 без оценки.

Другие вопросы по тегам