передать переменную из нижней про c в верхнюю про c в Tcl - PullRequest
0 голосов
/ 01 мая 2020

У меня есть следующий код, и он печатает то же значение переменной c во внутренней l oop.

global c

proc one { a c } {
    for {set i $a} {$i < 10} {incr i} {
        two $c
    }
}

proc two { c } {
     incr c
     puts "Value of c is $c"
}

Когда я запускаю его со следующими входами:

two 0 3

, он печатает 10 раз «Значение c равно 4» вместо того, чтобы продолжать увеличивать значение c внутри l oop от 4 до 13.

Проблема в том, что значение c от pro c два не переходит снова к for для l oop и принимает то же значение от pro c один парсер c как 3. Как я могу получить желаемый вывод?

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

Звучит так, как будто вы хотите передать переменную c из proc one в proc two по ссылке , чтобы изменения в значении переменной отражались обратно в вызывающей стороне.

Один из способов достижения sh этого в tcl - передать имя переменной и использовать команду upvar следующим образом:

proc one { a c } {
    for {set i $a} {$i < 10} {incr i} {
        two c  ;# <= note: passing 'c' by name, not by value
    }
}

proc two { c_name } {
    upvar $c_name c  ;# <= note: c in this proc is using callers variable
    incr c
    puts "Value of c is $c"
}

one 0 3

Выше выдает следующий вывод:

Value of c is 4
Value of c is 5
Value of c is 6
Value of c is 7
Value of c is 8
Value of c is 9
Value of c is 10
Value of c is 11
Value of c is 12
Value of c is 13
0 голосов
/ 01 мая 2020

Мне известно, что следующее не отражает действительный вопрос ФП, это больше похоже на предложение пересмотреть проект. Зачем здесь начинать передачу параметров «по ссылке»?

Почему бы просто не придерживаться функционального стиля, используя return и постоянно обновлять переменную pro c -local c в пределах l oop сценарий тела?

proc one { a c } {
    for {set i $a} {$i < 10} {incr i} {
        set c [two $c] ;# <= note: passing 'c' by value
        puts "Value of c is $c"
    }
}

proc two { c_value } {
    incr c_value
    return $c_value
}

one 0 3

Это сделает two повторно используемым в разных контекстах разными вызывающими. Также: его можно легко распространить на несколько возвращаемых значений, обновления переменных, используя lassign в контексте вызывающего (one).

...