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 |

2008-01-16

Lispの変な関数名

| 01:07 | Lispの変な関数名 - わだばLisperになる を含むブックマーク はてなブックマーク - Lispの変な関数名 - わだばLisperになる

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

確かに、古来の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さんのLispy Days経由、ClikiのKent Pitman氏のcomp.lang.lispのポストであらましが読めます。

また、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では、特殊文字は/によってエスケープ処理して出力されます。

  • prin1の1

そもそもprin1の1は謎なのですが、自分が調べた限りでは、PDP-1 LISPに登場するのが最初のようです。printとの違いは、前後にスペースを出力したりしない、とのこと。もしかしたら、後述の名前の後の1系の補助関数的ネーミングなのかもしれません。

  • 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までは逆でした。(INTERLISPUtilispでも逆です。)

  • 名前の後の1

foo-bar1のような名前も良くみかけますが、これは、PDP-1 LISP位からの伝統のようで、foo-barの補助関数という意味で付けられることが多いようです。似たところでは、foo-bar-1、foo-bar-aux、foo-bar*等。引数を一つとるという意味で、Gaucheのlet1などもありますね。

以上、殆ど憶測の域を出なかったりするのですが、AIメモ等を読んだりして調べてみたところでした。