# Functions and Scopes - 2

Dynamic variables are symbols that can be temporally bound to a new value, and the binding propagates into the body of a function. This pattern is known as dynamic scopes, and is generally considered as a bad idea. Nonetheless, here it is.

The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offense. Edsger W. Dijkstra

## Declaration of dynamic var

Dynamic vars are special symbols. Unlike other symbols, their bindings can be changed in the same scope.

(def ^:dynamic tax-rate 0.1)
(defn calc-tax [income] (* tax-rate income))

The dynamic var acts as a normal symbol, and is captured by the lexical rule.

(calc-tax 1000) ; => 100.0

## Dynamic binding

But the existing binding of a dynamic var can be modified.

(binding [tax-rate 0.15]
(calc-tax 1000)) ;=> 150.0

This is something that (let ...) cannot achieve:

(let [tax-rate 0.15]
(calc-tax 1000)) ;=> 100.0