| ActiveTcl User Guide |

# Modularization - source

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 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"