Tcl Eval, но я не уверен - PullRequest
       2

Tcl Eval, но я не уверен

0 голосов
/ 12 января 2020

У меня есть эта команда, и я не могу ее изменить:

proc command1 {} {

    global var_command1

    if {$var_command1 == "" } {
        puts "nothing..."
    } else {
        puts $var_command1
    }
}

Я хотел бы отправить эту переменную этой команде:

set myvar 10
set var_command1 "global myvar; Result= \$myvar"
command1

и получить такой результат:

Результат = 10

Итак, я попробовал команду eval:

set var_command1 "[eval {global myvar ; [puts "Result= \$myvar"]}]"

Как я уже сказал, эта команда может быть неправильной один, а также я не знаю, возможно ли это ...

1 Ответ

1 голос
/ 13 января 2020

Ваша процедура не оценивает содержимое этой переменной. Он просто читает его (возможно, несколько раз) и печатает его не более одного раза. Вы можете, конечно, установить переменную на результат оценки скрипта, но оценка должна быть выполнена до того, как эта процедура будет сканирована, по крайней мере, если вы не сделаете что-нибудь «умное» со следами чтения. Но не делай этого; это было бы очень запутанным и очень хрупким на практике! (Это настолько ужасная идея, что я не собираюсь предоставлять пример кода для него. На самом деле не используйте для этого трассировки, так как вы создадите код, который вы никогда не сможете отлаживать.)

In В общем, Tcl старается не оценивать код, за исключением случаев, когда ему прямо сказано сделать это, поскольку неожиданная оценка может стать дырой в безопасности самого высокого порядка и источником огромного количества ошибок и других fl aws.

Если вы хотите изменить процедуру, вот что она должна стать:

proc command1 {} {
    global var_command1
    set result [uplevel 1 $var_command1]
    if {$result eq ""} {
        puts "nothing..."
    } else {
        puts $result
    }
}

Изменение заключается в том, что она использует uplevel 1 для оценки сценария в области действия вызывающей стороны (uplevel #0 всегда использование глобальной области видимости также было бы жизнеспособным, учитывая, что сценарий не передается в качестве аргумента). Кроме того, оператор eq предпочтителен для сравнения строк над ==; в этом случае это не имеет большого значения, поскольку сравнение выполняется с нечисловым числом, но использование правильного оператора генерирует немного лучший байт-код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...