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?
5
A
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
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
- 1. cómo funciona el comando upvar en TCL?
- 2. Tcl Funciones anónimas
- 3. Pasando la lista al procedimiento Tcl
- 4. Pasando unique_ptr a las funciones
- 5. Pasando expresiones a funciones en python?
- 6. Ejemplo para acceder a funciones Tcl desde Python
- 7. Pasando valores html a las funciones javascript
- 8. ¿Cómo inicializar una matriz en Tcl?
- 9. pasando cadenas a funciones ctypes en Python 3.x
- 10. Funciones del conjunto hash y lista de arreglos
- 11. pasando variables a jQuery ajax éxito o funciones de error
- 12. Pasando el mapa de funciones a una macro
- 13. referencia indefinida a "solo algunas funciones math.h"
- 14. Crear un intérprete TCL que solo admita comandos que suministre
- 15. ¿Cómo ejecutar el script tcl en otro script tcl?
- 16. matrices y matrices a funciones como punteros y punteros Pasando a los punteros en C
- 17. Convertir char [] arreglos de cuerda a
- 18. ¿Necesitamos "desarmar" variables en TCL?
- 19. TCL: buscar recursivamente subdirectorios para obtener todos los archivos .tcl
- 20. aritmética de números complejos en Tcl?
- 21. Cómo poner bloquear los comentarios en TCL
- 22. Pregunta de TCL: cómo enumerar las funciones en un espacio de nombres
- 23. Pasando HttpContext.Current.User.Identity a WCF
- 24. Pasando credenciales a WebProxy?
- 25. pasando datos a subprocess.check_output
- 26. ¿Cómo puedo redireccionar stdout a un archivo en tcl
- 27. Capture "Tcl Interpreter Error"
- 28. Indexación de Mongo en arreglos de objetos frente a objetos
- 29. Pasando BOOL a makeObjectsPerformSelector: withObject:
- 30. cadena TCL concat
¿Qué pasa con el amperand en su proceso by_upvar? Sin sintaxis Tcl. –
@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). –
OK, cierto. Usualmente uso "varname". Sin embargo, hay un error en el comando upvar: debe ser 'upvar 1 $ & arrName arr' –