Hola,
Es una buena decisión el escribir tu programa en forma modular, aunque creo que la estrategia que estás usando falla debido a un pequeño detalle que quizás estás interpretando mal.
El comando `source' en Tcl sirve para cargar el contenido de un archivo externo (que presumiblemente contiene código Tcl) y ejecutarlo de inmediato, retornando el valor de la última sentencia ejecutada desde el archivo. Eso es todo. Así que `source' no sabe de "argumentos" que puedan pasarse al archivo externo, tal y como te has dado cuenta.
Por lo que alcanzo a interpretar de tu enunciado, tal vez lo que has hecho es escribir en cada uno de tus archivos tcl una serie de comandos secuencialmente, que naturalmente al ser importados desde el llamado a `source', se ejecutan directamente y llevan a cabo su labor de inmediato. En este sentido, no hay forma de pasarle argumentos a una secuencia de comandos libres, a menos que sean parte de un procedimiento.
Cuando usas procedimientos sí resulta natural el proceso de pasar argumentos a tus "módulos" de código.
Consideremos, por ejemplo, que inicialmente contamos con dos archivos: principal.tcl y modulo.tcl, con el siguiente contenido:
principal.tcl
Código:
puts "Este es el programa principal"
source modulo.tcl
modulo.tcl
Código:
set a 3
set doble [expr $a * 2]
puts "El doble de $a es $doble"
En efecto, el archivo `modulo.tcl' representa en nuestro caso una especie de librería con una serie de comandos que son ejecutados cuando se hace el llamado al comando `source':
Código:
$ tclsh principal.tcl
Este es el programa principal
El doble de 3 es 6
Si quisiéramos adaptarlo para que el código de `modulo.tcl' trabajara en función de un valor que se pase como argumento, la forma natural de hacer las cosas es implementar un procedimiento. En ese caso, los archivos podrían modificarse de este modo:
principal.tcl
Código:
puts "Este es el programa principal"
source modulo.tcl
# Ahora existe un procedimiento llamado `doble', al que podemos llamar
# con un argumento
doble 3
modulo.tcl
Código:
proc doble {a} {
set doble [expr $a * 2]
puts "El doble de $a es $doble"
}
Espero que te sirva como guía para adaptar tus módulos acordemente.
Un cordial saludo