 
   # A **Block** is the only node that can serve as the root.
   compileRoot: ->
-    o =
-      namespace: new Namespace
+    o = {namespace: new GlobalNamespace}
     o.namespace.createVariable("printc", getType new Type "func", [intType]).asm = stdlib.printc
     o.namespace.createVariable("prints", getType new Type "func", [stringType]).asm = stdlib.prints
     code = @compileStatement o

  constructor: (@label, @code) ->

class Namespace
  constructor: ->
    @names = {}
    @variables = []
    @funcs = []
    labelCount = 0
    @nextLabel = -> "_#{labelCount++}"
  find: (name) ->
    @names[name]
  createVariable: (name, type) ->
    variable = new Variable name, type, this
    @names[name] = variable

    value = @value.unwrapAll().compileExpression o
    variable = o.namespace.find name
    if @context is ":="
      throw SyntaxError "variable \"#{name}\" is already declared" if variable?.namespace is o.namespace
      variable = o.namespace.createVariable name, value.type
      variable.asm = ":#{variable.mangledName()} dat 0"
    else
