TUTSchemeの変数には,大域変数と局所変数がある. 大域変数は,同じ名前の局所変数によって隠蔽(hiding)されない限り プログラム中のどこからでも参照できる. 組み込み関数はすべて大域変数の値として格納されている. 例えば, carという大域変数の値は, 初期状態では carの関数 #<function car>である. また,組み込みの大域変数 tと nilは, 初期状態ではそれぞれ #tと空リスト ()を値とする. 後述の特殊フォームを表す記号は大域変数として使用できない. これら以外の記号はすべてユーザの定義する大域変数として使用できる.
例:
ifエラー
car#<function car>
t#t
nil()
大域変数の値は自由に変更することができる. 組み込みの大域変数の値を変更することも可能であるが, エラーの原因になりかねないので避けるべきである.
例:
> (define foo 10)
foo
> foo
10
> (set! foo 1)
1
> foo
1
> (car '(a . b))
a
> (set! car cdr)
Warning: car is being redefined.
#<function cdr>
> (car '(a . b))
b
局所変数を導入するには, 特殊フォームの lambda,let,let*,letrecまたは do式を 使用する. TUTSchemeは静的スコープを採用しており,局所変数は, それを導入した lambda,let,let*,letrecまたは do式内に 限って参照できる. 特殊フォームを表す記号を局所変数として使ってはならない. それ以外の記号は自由に局所変数として使用してよい. 組み込みの大域変数と同じ記号を局所変数として使用してもよいが, エラーの原因になりかねないので避けるべきである.
例:
> (define foo 10)
foo
> foo
10
> ((lambda (foo) (+ foo foo)) 1)
2
> foo
10
> ((lambda (car) (car '(a . b))) cdr)
b