Scheme and Clojure are Lisp-1 which means that both variables and functions names are in the same namespace.

Common Lisp is Lisp-2 which means that functions and variables have different namespaces.

Lisp has lexical scoping and dynamic scoping.


A binding made by let lasts until the end of the let form.

(let ((a 1))
  (let ((a 2))
    (let ((a 3))
      (print a)) ;; 3
    (print a))   ;; 2
  (print a))     ;; 1

Function calls create bindings for their formal arguments when they are called:

(defun foo (a)
  (let ((a 2)) (print a))  ;; 2
  (print a))               ;; 1
(foo 1)

A binding made by a function call lasts until the call returns.

A let expression can be seen as syntactic sugar for the lambda form:

(let ((a 1)
      (b 3))
  (+ a b))

is equivalent to

((lambda (a b) (+ a b)) 1 3)
(let ((to_add 4))
  ((lambda (arg) (+ to_add arg)) 5))

: 9