レキシカルとダイナミック:2種類の入れ子

変数のように、あるLisp Objectを名前で参照するときに、2つの入れ子構造を使い分けます。これらをレキシカル・スコープとダイナミック・スコープと呼びます。

スコープとは、ある名前(シンボル)とLisp Objectの結びつき(バインディング、binding)が見える(有効である)ソースコードの範囲です。

入れ子の内側にいて、ある名前の値を参照しようとすると、その名前の一番内側のバインディングが見えるようになっています。同じ名前の外側のバインディングは一時的に見えなく(shadowed)なります。

レキシカル・スコープ
レキシカルな、つまり、プログラムのソース・コードの字面上でのオペレータの入れ子構造によって範囲(スコープ)が表されます。

KISS>(defun f (a)                              ;; ----------+
       ;; a is an argument given when called   ;;           |
       (let ((result (list a)))                ;;           |
         (let ((a 0))                          ;;           |
           ;; a is 0                           ;; -------+  |
           (setq result (cons a result))       ;;        |  |
           (let ((a 10))                       ;;        |  |
             ;; a is 10                        ;; ----+  |  |
             (setq result (cons a result))     ;;     |  |  |
             (let ((a 100))                    ;;     |  |  |
               ;; a is 100                     ;; --+ |  |  |
               (setq result (cons a result)))  ;; --+ |  |  |
             ;; a is back to 10                ;;     |  |  |
             (setq result (cons a result)))    ;; ----+  |  |
           ;; a is back to 0                   ;;        |  |
           (setq result (cons a result)))      ;; -------+  |
         ;; a is back to the original argument ;;           |
         (setq result (cons a result))         ;;           |
         result))                              ;; ----------+
f

KISS>(f -1)
(-1 0 10 100 10 0 -1)

KISS>
ダイナミック・スコープ
ダイナミックな、つまり、実行時のオペレータ(関数やスペシャル・オペレータ)の動的な呼び出し関係の入れ子構造によってバインディングが見える範囲(スコープ)が決定します。

KISS>(defun foo (x)
       (dynamic-let ((y x))
         (bar 1)))
foo ;; 関数foo定義完了
                
KISS>(defun bar (x)
       (+ x (dynamic y)))
bar ;; 関数bar定義完了

                
KISS>(foo 2)
;;(foo 2)により関数fooが呼び出される
;;  (foo 2)
;;    |  関数fooの引数であるレキシカル変数xは2
;;    |  関数foo内の(dynamic-let ((y x))で、xはいま2なので、
;;    |  ダイナミック変数yの値は2に設定される
;;    |  (dynamic-let ((y 2))
;;    |
;;    |    関数foo内の (bar 1) により関数barが呼び出される
;;    |    (bar 1)
;;  |      |関数barの引数であるレキシカル変数xは1
;;    |      |
;;    |      |関数bar内の (dynamic y) は
;;    |      |実行中の関数foo内の(dynamic-let ((y 2))による
;;    |      |ダイナミック変数yを参照
;;    |      |つまり(dynamic y)は2となる
;;    |      |
;;    |    (+ x (dynamic y)) は、(+ 1 2)になる
;;    |    3を返す
;;    |
;;    3を返す

3

KISS>




Lispのリスト図解

Lispが扱うリストの構造を図解します。これは理解のためのイメージですので、必ずしも実装がこの図解のままの構造を使っているとは限りません。

リスト(正式にはproper list)のテキスト表現は要素をスペースで区切って並べてそれをカッコ()でくくります。

例えばリスト

(a 1 2.0)

は、最初の要素はシンボルaです。2番目の要素は整数1、3番目の要素は小数2.0です。

このリストの処理系内での構造を図にすると次のようになります。

 (a            1           2.0)

+---+---+    +---+---+    +---+---+    +---+
|CAR|CDR---->|CAR|CDR---->|CAR|CDR---> |nil|
+-|-+---+    +-|-+---+    +-|-----+    +---+
  |            |            |
  V            V            V
+---+        +---+        +---+
| a |        | 1 |        |2.0|
+---+        +---+        +---+

リストは、Consセルと呼ばれる部品から作られています。
Consセルは、CAR、CDRという名前のポインタを持ちます。
リストの要素は必ずCARが指し、CDRはリスト構造のために使います。

+---+---+   +---------+
|CAR|CDR--> | Object2 |
+-|-+---+   +---------+
  V
+---------+
| Object1 |
+---------+
(a 1) なら、

+---+---+    +---+---+    +---+
|CAR|CDR---->|CAR|CDR---->|nil|
+-|-+---+    +-|-+---+    +---+
  |            |            
  V            V
+---+        +---+        
| a |        | 1 |        
+---+        +---+       
(a) なら、

+---+---+    +---+
|CAR|CDR---->|nil|
+-|-+---+    +---+    
  |
  V          
+---+        
| a |        
+---+        
() なら、

+---+
|nil|
+---+

シンボルnilは、リスト構造の終わりを表す印として使われますが、要素が何もない空リストは、この印nilのみで表すのが自然です。そこで、シンボルnilはシンボルでありながら同時にリストでもあるという面白い性質を帯びることになります。

KISS>(symbolp 'nil) ;; nilはシンボルか?
t                   ;; yes

KISS>(listp 'nil)   ;; nilはリストか?
t                   ;; yes

KISS>(eq 'nil '())   ;; シンボルnil は 空リスト()と同一物か?
t                    ;; yes

KISS>(length '())    ;; ()の要素数は?
0                    ;; 空リストは要素を持たない

KISS>




陰謀論サイトを読んで思ったこと

いわゆる、「ロスチャイルド家とかロックフェラー家が~」っていう感じの陰謀論のサイトを読んでみた感想を少し書きます。

正直、すこし面白いなと思いました。もともと、UFOとか超能力とかその手のオカルトや陰謀論の話題が好きなんですね。中学生の頃は、仲間と一緒に「ムー」を回し読みしていました。

たしかに、自分が大統領と家族ぐるみの付き合いがあるとか、金融界の大物とたいがい顔見知りだったりという状況にあったら、また自分自身もそうとうな金持ちであるとしたら、なんらかの影響力つまりパワーを持っているという自覚は必要でしょうし、パワーを持っている以上、それをどう使うのか、また、使わないのかは判断するべきだと思います。

で、必然的に、その人は世界におけるリーダー的役割を務めざるを得ないと思うのですが、そういう人に直接会ってみて、オフレコで、ぶっちゃけ世界をどうしたいのか聞いてみたいです。自分の影響力(パワー)をできるだけ維持したいとかでもいいので、ホンネを聞いてみたいです。

ネットで読んだ話ですが、世界のトップ10人の金持ちが持っている資産の合計=全世界の貧乏人にあたる下半分(35億人くらい?)の資産の合計だそうです。

いわゆる格差が広がっていると。で、歴史上を見てみると、こういう格差が解消されるのは、常に広い意味での暴力(革命・戦争・疫病の大流行などなど、つまり大量の血が流れる)によっているということを、これもネットでどっかの偉い教授が言っているのをみました。

う~ん、どうも、あまりパワーを集めるのを追及すると、いつかそれってひっくり返されるんじゃないかって恐怖心はわかないのかな…

私ももう少し金パワーが欲しいな(笑)…

などなど、いい妄想のタネになりました。