#:g1: 史上初のSETFを探す旅

Posted 2018-12-02 18:25:23 GMT

Lisp SETF Advent Calendar 2018 3日目 》

探す旅とか書いてますが、LispでSETFのようなものが初めて導入されたのは、結論からいうとLISP 2(1965)だと思います。
しかし、Lispの歴史の文献については、The Evolution of Lispが決定版で良く知られているものなのですが、LISP 2についての記述は何故か殆どありません。
EoLに拠り所にするならば、1973年のL Peter Deutsch氏のByte Lisp(setfq)が最初となるでしょう。

さて、LISP 2ですが、LISP 2は、後世のLispの試行錯誤を先取りしている所が多々ありますが、それはAlgolとの接近による所が多いです。
その後のLispがAlgol化していったから、とも言えますが、具体的には、

あたりがあります。

1975年にSchemeがAlgolの影響でLispに静的スコープを取り入れたのが、Lisp史の一つの大きな転換点とされますが、Schemeに10年先行して、LISPをまんまAlgol化しようとしたLISP 2が完全に忘却されているのは不思議ではあります。

なお、LISP 2の発掘については、Paul McJones先生が熱心に取り組まれているようです。

LISP 2は構想のみで実装はなかった、とされていましたが、先日実装も発見されたようです。後世で発掘されるというのも面白い。

さて、この記事ではsetfがメインテーマなので、上記3項目の中では、拡張された左辺値について詳しくみて行くのですが、setf関連については、 LISP II Internal Language(1965) 3.1 ASSIGNMENT-EXPRESSION, LOCATIVES に纏められています。

これによると、(SET locative expression)という形式になっていて、locativeというのがCommon Lispのsetfでいうplaceという感じになっています。
locativeには、ビットやリスト、配列があり、下記のように書けたようです。

(set (car x) b)

(set (cdr x) b)

(set (bit 2 2 a) (bit 2 2 15))

(block ((a real array) (m integer)) (set (a m) 42))

(set (prop (quote x)) (quote (p 42)))

S式は中間言語なので、表層言語でも書いてみると、

car x ← b;

cdr x ← b;

bit (2, 2, a) ← bit (2, 2, 15);

begin real array a; integer m; a[m] ← 42; end;

prop 'x ← '(p 42);

となります。
これらは、Common Lispで書くと、それぞれ、

(setf (car x) b)

(setf (cdr x) b)

(setf (ldb (byte 2 2) a) (ldb (byte 2 2) 15))

(setf (aref a m) 42)

(setf (symbol-plist 'x) '(p 42))

となります。
LISP 2では型宣言するので、配列のsetでは、(配列名 インデックス)という形式でOKのようです。

読み出しと書き込みの記法の二重性について

左辺値について、1960年代初頭のFORTRAN、Algol、CPLあたりの扱いを眺めてみましたが、左辺に配列の記法が来るものは、添字付き変数という概念のようで、配列のアクセサが介在するものではないようです。
LISP 2の記法でもその辺りを踏襲しているように見えますが、locativeという概念で左辺にアクセサの記法が出てくるのは、当時の他の言語と比べてもそれなりに先進的だったのかもしれません。

参考


HTML generated by 3bmd in LispWorks 7.0.0

comments powered by Disqus