Lispの変な関数名 — #:g1

Posted 2008-01-15 16:07:00 GMT

自分の好きな話題なのでトラックバックを打たせてもらいます!

確かに、古来のLispから引き継がれた変な名前の関数名は結構ありますよね。
そこで自分の分かる範囲で調べてみたことを書いてみたいと思います。

SETQのQ
これは、(set (quote foo))が縮まったもののようです。
qで終る系統は、quoteの略と、eqのqの系統があるようでeqの系統は、Common Lispでは滅びましたが、SRFI-1では復活したりしています。memqとか。
また、INTERLISP系にはquoteのq系統が沢山あるのですが、Maclisp系統にはそんなにないようです。
SETのF
これは、Kent Pitman氏によれば、"set field"の略だそうです。
onjoさんの(http://lambda.s55.xrea.com/20040216.html)経由、ClikiのKent Pitman氏のcomp.lang.lispのポストであらましが読めます。
-Re: Naming of GET, SET, GETF, SETF, and SETQ.
また、The Evolution of Lispによれば、これはPeter Deutsch氏のアイディアだそうで、当初setfqだったものが、Lispマシンでsetfになったとのこと。
リーダーで読み出した場所に値をセットするというアイディア自体は、Deutsch氏によれば、かの有名なアラン・ケイだそうです。
PRINCのC
これは、調べてみても解説がみつかりませんでした。princが一番最初に登場するのは、自分が調べた限りではPDP-6 LISP(AIM-116a)なのですが、どうも、characterのcなんじゃないかという感じです。PDP-6 LISPでは、print、prin1とprincの違いは、Common Lispでもそうですが、read入力にかなった文字列を出力するかどうか、とのことですが、princは、文字通りそのまま印字するということなので…。print、prin1では、特殊文字は/によってエスケープ処理して出力されます。
※2013-03-21追記: CharacterのCみたいです。
prin1の1
そもそもprin1の1は謎なのですが、自分が調べた限りでは、PDP-1 LISPに登場するのが最初のようです。printとの違いは、前後にスペースを出力したりしない、とのこと。もしかしたら、後述の名前の後の1系の補助関数的ネーミングなのかもしれません。
※2013-03-21追記: 古いマニュアルによると、一つ式を出力するから、prin1、というようなことを書いてあったりしますが、どうもはっきりしないようです。
Lisp 1.5マニュアルによると、printは、prin1とprin2という下請け関数によって構成されていて、prin1はアトムを印字、prin2は式でない記号(括弧や改行)を印字するものだったようです。
prin1、prin2と存在していたとなると、下請け関数の命名がそのまま受け継がれてしまったのではないかと想像しています。
NCONC、RPLACA
mokeheheさんのお察しのとおりで、破壊的操作系の、n〜は、no consingで、rplacaは、replace carのようです。
ちなみに、LISP 1.5には、conc(恐らくconcatenateの略)という今のappendと同じ働きをするものが存在していました。当時APPENDは、引数を2つしか取らなかったためと思われます。PDP-6 LISPで、APPENDが拡張されたためか消滅してしまいました。

おまけ

mapcar、maplist
大元のLISP 1.5には、MAP、MAPLIST、MAPCONとあるのですが、MAPは、'(foo bar baz)というリストがあった場合に、'(foo bar baz)→'(bar baz)→'(baz)というようにリストを処理するもので、返り値には期待しない処理に使うものだったようです。(Common Lispでの、mapl)
このMAPを規準にして考えると、各要素をCARで処理して結果をリストで返せば、MAPCAR、LISTで処理すればMAPLIST、継げれば(CONcatenate)、MAPCONということなんじゃないかと思います。また、引数の[関数 リスト]という今日のCommon Lisp、Schemeでお馴染みの順番は、PDP-6 LISPからのようです。LISP 1.5、PDP-1 LISPまでは逆でした。(INTERLISP、Utilispでも逆です。)
名前の後の1
foo-bar1のような名前も良くみかけますが、これは、PDP-1 LISP位からの伝統のようで、foo-barの補助関数という意味で付けられることが多いようです。似たところでは、foo-bar-1、foo-bar-aux、foo-bar*等。引数を一つとるという意味で、Gaucheのlet1などもありますね。
以上、殆ど憶測の域を出なかったりするのですが、AIメモ等を読んだりして調べてみたところでした。

comments powered by Disqus