CommonLispメモ

CommonLispはトップレベルに定義された変数はスペシャル変数となりダイナミックスコープを持つ

(defvar x 10)

(defun foo () x)

(let ((x 100))
  (foo)) => 100

レキシカルスコープ

こんな風にコーディングすることがあるのかどうかは知らんが。

(let ((x 10))
  (defun hoge () x))

(let ((x 100))
  (hoge))    ;;  => 10

schemeだと
(let ((x 10))
  (define (hoge) x)) ;; => #<undef>

(let ((x 100))
  (hoge)) ;; =>  hogeは分からんというエラー!

schemeの defineは、定義されたスコープの外側から呼び出すことができない。
Lispのdefunは出来るのね。

(let ((x 10))
 (defun hoge () x)
 (let ((x 100))
   (hoge))) ;; => CommonLisp/schemeとも 10が返る。レキシカルスコープが機能してることが分かる。