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 |

2010-07-30

(42)TAOにおける代入計算機構(1985)

| 23:47 | (42)TAOにおける代入計算機構(1985) - わだばLisperになる を含むブックマーク はてなブックマーク - (42)TAOにおける代入計算機構(1985) - わだばLisperになる

TAO関係の論文を漁っておりますが、今回は、

です。

8/7〜9日のELIS復活祭まで一通りの論文を読み終えておこうと思っていたのですが、まったりしているうちにあと1週間位しかなくなってしまいました。

あと、十本位あるのですが…。

とりあえず、90年代以降は、TAO/ELISではなく後継のTAO/SILENTになるようなのでTAO/ELIS時代は眺めておきたいところ。

本文は、TAOのコードの見た目の特徴にもなっている、代入機構(!や!!)についてです。

ちなみに!や!!より前には、:や、::で表現されていたようで、!に切り替わったのは、この論文の後位のようです。

この代入の機構は、CLでいえば、(setf (car foo) :foo)のようなところを、TAOだと(:(car foo) :foo)と書けます。

CLの場合は、マクロで実現していますが、TAOでは、これをマイクロプログラミングレベルで実現しているとのこと。

読み出してきた値の保持には専用のレジスタが使われます。

TAOだとsetqもマクロで(:x 'foo)の方がよりプリミティブになるとのこと。

(:x 123)

というのは元より

(defvar y (list 1 2 3 4))
(defvar n 2)

(:(member n y) (+ n 1))
;⇒ (1 3 3 4)

(defvar flip nil)
(defvar flop 42)
(defvar x (cons 1 2))

(:(cond ((null x) (car x))
        (t (cdr x)))
  flop)
;⇒ (1 42)

のようなこともできるようです。

また、(:x y)という式は、(:という記号になり、代入のタグが立ったリストになるそうで、carもcdrも取れるとのこと(どういうことになるのやら)

もう一つ特徴的なのが、自己代入式ですが、

(::cons :x y)

のように書き、CLだと

(seq x (cons x y))

のような動作になります。

この場合でもTAOの場合、xの参照は、代入レジスタのお蔭により1回で済むということです。

また、最後の方は、locativeというMITのLISPマシンでもお馴染のデータ型との組み合わせの解説があります。

locativeだとアドレスを直接扱うことができるのですが、これと件の代入機構と、Smalltalk的なメッセージセンドの構文が融合することによりかなりカオスなことになっていますので、興味のある方にはかなり面白い内容ではないかなと思います。

ゲスト



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