Nuestros programadores estrellas han agotado sus reservas de café, buscando noche y día por la respuesta, hasta que Melina halló el resultado en Gitea así que ahora la compartimos con nosotros.
Solución:
Depende de lo que realmente quieras decir.
Una forma es escribir un tercer script (“maestro”) que haría
source /the/path/to/the/first.tcl
source /the/path/to/the/second.tcl
Otra forma es simplemente agregar la segunda llamada a source
desde el ejemplo anterior hasta la parte inferior del primer script.
Enmienda al primer enfoque: si los scripts a ejecutar están ubicados en el mismo directorio que el script maestro, una forma idiomática de source
ellos es
set where [file dirname [info script]]
source [file join $where first.tcl]
source [file join $where second.tcl]
De esta manera, el abastecimiento funcionará sin importar cuál sea el directorio del proceso actual y dónde se encuentre el directorio del proyecto.
Si bien esta es generalmente una respuesta correcta, debido a que la pregunta no se formuló con precisión, hay muchas formas de lograr el objetivo de ejecutar el código Tcl desde dentro de Tcl. Quiero entrar en esto en detalle porque comprender la ejecución del código es un punto importante para comprender Tcl en sí.
Hay source
los source
El comando no debe confundirse con la ejecución de scripts de una manera clásica, lo que creo que ha pedido el iniciador del hilo.
El comando fuente es como el comando “incluir” en c/perl/php. Los lenguajes como java o python, por otro lado, solo tienen mecanismos de “importación”.
La diferencia es que esos idiomas crean una base de datos interna de los paquetes disponibles, que están vinculados a los archivos fuente/binario/código de bytes correspondientes. Al escribir una declaración de importación, se cargan la fuente vinculada o el código de bytes o los archivos binarios. Esto permite una gestión de dependencias más profunda sin escribir código adicional. En Tcl esto se puede lograr con espacios de nombres y el package require
dominio. Ejemplo:
Supongamos que tiene este source.tcl:
proc foo bar puts "baz"
set BAM "BOO"
Ahora, tienes tu script “maestro” como lo llamas. Yo lo llamo “principal”. Tiene el contenido:
set BAM my important data
source source.tcl
#also the function foo can now be used because the source reads the whole script
foo wuz
set BAM
#will output "BOO"
los exec
dominio
Si puede vivir con la sobrecarga adicional de iniciar una instancia de intérprete completamente nueva, también podría hacer:
set BAM my important data
exec tclsh source.tcl
#The variable BAM will not be modified. You can not use the function foo.
los eval
dominio
El comando eval
puede evaluar un string o una lista (en Tcl todo es un string) como si fuera un código programado. Tendría que cargar el archivo fuente completo en un string. y luego usar eval
para evaluar el código dentro de un alcance separado, para no sobrescribir cosas en su archivo fuente principal.
set fp [open "somefile" r]
set code_string [read $fp]
close $fp
eval $code_string
Solo necesita usar la fuente para ejecutar el segundo script.
source "/tmp/whatever.tcl"