2010-08-18 12 views
5

Por lo que tengo entendido, en tcl si desea pasar una matriz con nombre a una función, debe acceder al alcance superior de la persona que llama a través del comando upvar dentro del cuerpo de llamada. ¿Es esta la única forma de pasar una matriz en tcl?pasando arreglos a funciones en tcl. Solo upvar?

Respuesta

5

Hay other ways, como convertir primero en una lista (a través de array get y array set).

9

Como indicó Michael, hay varias formas, además de una página wiki que lo analiza. Sólo para tener algo de esa información aquí, algunas opciones son:

Por Upvar

proc by_upvar {&arrName} { 
    upvar 1 ${&arrName} arr 
    puts arr(mykey) 
    set arr(myotherkey) 2 
} 
set myarr(mykey) 1 
by_upvar myarr 
info exists myarr(myotherkey) => true 
  • da como resultado cambios en la matriz siendo vistos por la persona que llama

Por matriz obtener/establecer

proc by_getset {agv} { 
    array set arr $agv 
    puts arr(mykey) 
    set arr(myotherkey) 2 
    return [array get arr] 
} 
set myarr(mykey) 1 
array set mynewarr [by_upvar myarr] 
info exists myarr(myotherkey) => false 
info exists mynewarr(myotherkey) => true 
  • da como resultado cambios en la matriz siendo vistos por la persona que llama
  • mecanismo similar se puede utilizar para devolver una matriz
+0

¿Qué pasa con el amperand en su proceso by_upvar? Sin sintaxis Tcl. –

+0

@glenn jackman: "not tcl syntax"? ¡Disparates! Todo es sintaxis tcl :-). Como los nombres de las variables pueden ser cualquier cadena y & se usa en algunos otros idiomas para indicar la dirección de una variable, es una forma práctica de semi-auto-documentación de desregularla como un objetivo de un upvar. Es curioso cómo, después de tantos años, nunca pensé en usar &; Usualmente uso _ o fooVar (upvar $ fooVar foo). –

+0

OK, cierto. Usualmente uso "varname". Sin embargo, hay un error en el comando upvar: debe ser 'upvar 1 $ & arrName arr' –

2

Si sólo está pasando en el valor de la matriz, podría pase en su lugar un diccionario (sugerencia: array get serializa una matriz en un valor de diccionario) y use el comando dict para acceder a valores en ella. Pero si desea acceder al valor en vivo, upvar es definitivamente el más fácil. También es una técnica muy rápida; se compila para un recorrido extra de un puntero durante el acceso variable después de que termina el propio upvar.

Cuestiones relacionadas