Posted 2017-10-01 14:34:54 GMT

今日comp.lang.lispの過去ログを眺めていたら、SETFのFはFunctionのF説を説明している人をみつけた。

The thread suggests both FORM and FIELD, but the original meaning was FUNCTION :-) When the construct was first suggested it was called SETFQ for "set with function quoted, everything else evaluated", and only later abbreviated to SETF. (Source: the Gabriel/Steele "Evolution of Lisp" paper in HOPL-II).

自分もMITのLispマシングループが元ネタとしたA LISP machine with very compact programsの論文には、FieldやFormという記載はなく、Fといえば、Function位だよなあと思っていたが、Evolution of Lispにも記載があるとのことなので確認してみたら、

Deutsch commented that the special form used here is called SETFQ because "it quotes the function and evaluates everything else." This name was abbreviated to SETF in Lisp-Machine Lisp. Deutsch attributed the idea of dual functions to Alan Kay

と書いてあった。

また、Deutsch氏の論文にも、

A more useful function is (SETFQ (fn arg1 ... argn) newvalue) which quotes the function name and evaluates everything else. This allows RPLACA, for example, to be defined as (LAMBDA (X Y) (SETFQ (CAR X) Y) ).

とあり完全に見逃していたらしい。

この論文でいうFunctionは、CLでいう setf のaccessorみたいな所。

ちなみに、他の説も挙げておこう。

FはForm説

これは setf はシンボルだけではなくフォームを取るからなんだろうけど、特に誰かの裏付けはなく、なんとなくの皆の印象という感じだろうか。

FはField説

色々な所を眺めると、Kent Pitman氏が広めた感じだが、Pitman氏もDavid Moon氏から教えてもらったようなので大元はMoon氏らしい。

LISP 原書第3版(I) 13章 構造体 にも同様の説明がある。

ちなみに、Deutsch氏の setfq の機構はAlan Kay氏のアイデアが源泉とあるが、Lisp界全体でこのアイデアが最初に登場したのは、更に10年程遡って1964年頃のLISP 2だったようだ。

なお、LISP 2はAlgolからヒントを得ている。

LISP 2のS式構文では、

(set (car x) 42)

のように書ける。

まとめ

setf のFはFunctionのFだった。と書けば一行で終わる内容だが、色々書くとこんなに長くなる。

関連リンク

■

