Estou redefinindo set
o comando do Tcl para permitir múltiplas atribuições ao mesmo tempo. No entanto, quando tento usar as variáveis, ele relata um erro de "variável indefinida". Aqui estão as duas maneiras que tentei até agora:
proc set args {
uplevel foreach {*}$args break
}
proc set {l1 l2} {
uplevel foreach $l1 $l2 break
}
Eu executei um llength
on $args
e ele relatou uma lista de dois elementos. Estou bastante confuso sobre esse comportamento.
Estou chamando assim:
set {a b c d} {e f g h}
set {a s d f} {q w e r t y}
* Editar:
Fiz um pouco mais de ajustes nele. Encontrei uma maneira de fazer funcionar (na maior parte, porque valores extras são descartados silenciosamente, mas isso é irrelevante para a pergunta original), mas ainda estou confuso sobre POR QUE essa maneira funcionou e as outras não:
proc set {l L} {
uplevel foreach [list $l] [list $L] break
}
uplevel
junta seus argumentos como se tivessem sido passados paraconcat
, o que entre outras coisas, dizEntão sua primeira versão se torna
deixando
a
definido como b ,c
definido como d e assim por diante. Sua segunda versão acaba fazendo o mesmo; as duas listas são achatadas e seus elementos tornam-se argumentos individuais paraforeach
. A terceira versão, agrupando os argumentoslist
, torna-se a pretendidaa lista externa é removida, mas as internas permanecem.
Além disso, eu usaria um nome diferente
set
ou o definiria em um namespace não global, a menos que você também pretenda oferecer suporte à versão de argumento único queset
retorna o valor atual de uma variável. Muito menos confuso assim.