Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2009-01-21

demoプログラム起動篇

| 14:24 | demoプログラム起動篇 - わだばLisperになる を含むブックマーク はてなブックマーク - demoプログラム起動篇 - わだばLisperになる

今回は、デモプログラムを起動したところをキャプチャしてみました。

どうもfc2だと不適切な動画に判定されたようで、前回の動画が削除されてるみたいなんですが…。

アップしなおしてみたりしたのですが、削除されないことを祈ります(´▽`*)

最初の動画ですが、どうも途中から画像がおかしくなるみたいです。

YouTubeにアップも試してみているのですが、字がつぶれると観ても面白くないしなかなか微妙なところです。

トップレベルのsetq問題

| 12:11 | トップレベルのsetq問題 - わだばLisperになる を含むブックマーク はてなブックマーク - トップレベルのsetq問題 - わだばLisperになる

3、4ヶ月前にCL勉強会でトップレベルでのsetq問題について議論があったのですが、Richard Gabriel氏と、Kent Pitman氏のFunction Cells and Value Cellsを読んでいて興味深いことが書いてあったので自分なりに考えてみました。

興味深いのは、

17. Global Variables, Special Variables, and Constants.

の個所で、

A free variable in Common Lisp is currently taken
to be a dynamic rather than a lexical reference
because there is no global lexical environment in Common Lisp.
We introduce the concept of global variables;
when a variable is global, free references to it
are to the value cell of the symbol named by
the variable, and all bindings of it are still lexical.

のあたりです。

  • CLでは、基本的に自由変数は、レキシカル変数ではなくて、ダイナミック変数(スペシャル変数)になる
  • CLにはグローバルなレキシカル環境がない→トップレベルは空レキシカル環境
  • グローバル変数は、変数セルへの参照とする。

ということなので、これを元にトップレベルで宣言なしにsetqした場合を考えると

  • とりあえず、グローバル変数ということで変数セルに値が格納される

ということですが、今どきのSBCLや、CCLでは、トップレベルでsetqされた変数は、(symbol-value)にも値が格納されつつ同じ値を持つ非スペシャル変数という感じになっているようです。

この動作についてはどうも未定義動作らしいのですが、HyperSpecで探してもどこに書いてあるか自分は、探し出せていません…。

また、この文献についている年は、2001年なのですが、ANSI CLについての記述よりちょっと古い気がするので定義をHyperSpecであらためて確認する必要があると思いますが、同じくどの辺に書いてあるのか探し出せていません(^^;

ということでトップレベルで定義した変数にレキシカル変数の振舞いを求めることは確実ではないようなのですが、代替手段としては、define-symbol-macroを利用して模倣するというのが定番のようです。(define-symbol-macroで定義したシンボルはレキシカルに動作するため)

(defparameter *g* 42)
(define-symbol-macro ggg *g*)

(defvar *foo*
  (let ((ggg 30))
    (lambda () ggg)))

(cons ggg
      (let ((ggg 777))
        (list (funcall *foo*)
              ggg)))
;=> (42 30 777)

グローバル変数 = 値セルを参照

スペシャル変数 = ダイナミックに値セルを参照

レキシカル変数 = レキシカルスコープで環境を参照

グローバルなレキシカル変数 = なし(グローバルに定義される環境はない)

位に考えておけば良いのでしょうか。

どうも、変数のエクステントに加えて、LISP2特有の値セルの参照と、環境の参照の違いが加わってややこしいことになってる気がしてきましたが、文献を読んでなるほど!と思い書き始めたものの、また良く分からなくなって来たのでした(´▽`*)…。

そんなこんなのLISP2ですが、なぜか私はLISP2の方が好きです。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20090121