**Modularization - source** !!!!!! '''[Tcl Tutorial Lesson 29%|%Previous lesson%|%]''' | '''[Tcl Tutorial Index%|%Index%|%]''' | '''[Tcl Tutorial Lesson 31%|%Next lesson%|%]''' !!!!!! The `source` command will load a file and execute it. This allows a program to be broken up into multiple files, with each file defining procedures and variables for a particular area of functionality. For instance, you might have a file called `database.tcl` that contains all the procedures for dealing with a database, or a file called `gui.tcl` that handles creating a graphical user interface with Tk. The main script can then simply include each file using the `source` command. More powerful techniques for program modularization are discussed in the next lesson on packages. This command can be used to: * separate a program into multiple files. * make a library file that contains all the procs for a particular set of functions. * configure programs. * load data files. `source fileName`: Reads the script in `fileName` and executes it. * If the script executes successfully, `source` returns the value of the last statement in the script. * If there is an error in the script, `source` will return that error. * If there is a return (other than within a `proc` definition) then `source` will return immediately, without executing the remainder of the script. * If `fileName` starts with a tilde (~) then `$env(HOME)` will be substituted for the tilde, as is done in the `file` command. ---- ***Example*** sourcedata.tcl: ====== # Example data file to be sourced set scr [info script] proc testproc {} { global scr puts "testproc source file: $scr" } set abc 1 return set aaaa 1 ====== sourcemain.tcl: ====== set filename "sourcedata.tcl" puts "Global variables visible before sourcing $filename:" puts "[lsort [info globals]]\n" if {[info procs testproc] eq ""} { puts "testproc does not exist. sourcing $filename" source $filename } puts "\nNow executing testproc" testproc puts "Global variables visible after sourcing $filename:" puts "[lsort [info globals]]\n" ====== <> Resulting output (slightly edited to make the long list fit) ======none Global variables visible before sourcing sourcedata.tcl: argc argv argv0 auto_path env errorCode errorInfo filename tcl_interactive tcl_library tcl_patchLevel tcl_platform tcl_rcFileName tcl_version testproc does not exist. sourcing sourcedata.tcl Now executing testproc testproc source file: sourcedata.tcl Global variables visible after sourcing sourcedata.tcl: abc argc argv argv0 auto_path env errorCode errorInfo filename scr tcl_interactive tcl_library tcl_patchLevel tcl_platform tcl_rcFileName tcl_version ====== <> !!!!!! '''[Tcl Tutorial Lesson 29%|%Previous lesson%|%]''' | '''[Tcl Tutorial Index%|%Index%|%]''' | '''[Tcl Tutorial Lesson 31%|%Next lesson%|%]''' !!!!!!