前回 Array#tail を提案したとき、「頭(head)以外は全部尻尾(tail)ってのは、名前が。」と言われて初めて、tail という名前が不自然なことに何の疑問も持っていなかった自分に気がつきました。リストの先頭と先頭以外を head/tail と言うのはいつごろからなんでしょうか。我ながら下らないことしてるなーと思いつつも、気になったのでちょっとだけ調べてみました。
- とりあえず他の ML でも head/tail なのか調べてみました。Lazy ML 。とりあえず hd とか tl とか書いてあるものは見つかりました。これが 1994 年。
- そこからかなり辿って、Milner 大先生の偉大な論文にも hd と tl がありました (351 ページ) 。1977 年。
- ここで行き詰まったので、初期の ML を見てみようと思いましたが、いまいち情報が見つかりませんでした。wikipedia の ML の項目によると、ML の文法は ISWIM なる言語がベースになっているそうです。ISWIM は Landin 大先生の偉大らしい論文で解説されていました。検索しても hd とか head とかは見つからなかったのですが、よく見ると 161 ページの head と tail の定義っぽいところに (h) と (t) と書いてあります。きっと head と tail に違いありません。これが 1966 年。
- ISWIM とか聞いたこともないような言語にたどり着いたので、プログラミング言語年表をちらちら見てみたところ、COWSEL のサンプルコードにも hd や tl が書いてありました。HD や TL は組み込み関数らしいので、後の世の人がサンプルとして書いただけというわけでもなさそうです。これが多分 1964 年。
今のところ見つかったのはここまでです。COWSEL は ALGOL 60 ベースの言語 CPL に Lisp の機能を組み合わせた感じの言語らしいです (といっても逆ポーランド記法だけ借りたみたいにも読めますが) 。CPL の情報はあんまり見つからないのでわかりません。Lisp については、少なくとも John McCarthy の論文には car/cdr しか見つかりませんでした。head/tail は CPL 由来なのか、COWSEL で考案されたのか、それともまた別の言語 (当時の Lisp 方言とか?) から借りてきたのか、やっぱりよくわかりませんでした。
ここまで書いて気がついたけど、特定のプログラミング言語発祥とも限らないよなぁ。Church のλ計算関連の文献とかに載ってたりするかな。