Symbol definitions in `alv` normally follow 'lexical scoping' rules. That means
that symbols are looked up by following the scopes outwards according to the
syntactical nesting of expressions in the source code.

In the following snippet, for example, the symbol `hello` is resolved inside
`print-hello` by checking first the innermost scope (the function body), and
then the surrounding scope (the whole file), where the value `"original
message"` is found:

    (def hello "original message")
    (defn print-hello [] (print hello))
    
    (do
      (def hello "overwritten message")
      (print-hello))
```output
original message
```

On the other hand, there are also *dynamic symbols*. Dynamic symbols are
symbols whose name starts and ends with an asterisk, like `*clock*` and
`*sym*`. Where functions are called, dynamic symbols are not looked up in the
scope that contains the *function definition*, but rather the scope containing
the *function call site*:
      
    (def *hello* "original message")
    (defn print-hello [] (print *hello*))
    
    (do
      (def *hello* "overwritten message")
      (print-hello))
```output
overwritten message
```

This allows symbols to be *dynamically overwritten*.
