関数定義 defun で引数説明が少ないと思ったスーザン。 |
 | スー |
馬鹿なあなたのために、私が家庭教師を特別にしてあげるわ。感謝しなさい。 |
 | リン |
えー、スーちゃん、先生やるんだ、すごい!でも教えてもらう生徒ちゃん、かわいそう。 |
 | プー |
そんなことないかも、ううん、生徒君もきっと喜んでいるよ〜。・・・でも特殊な性癖を持つ生徒君かも。 |
 | スー |
2人とも何を言っているのかしら。今日は defun の引数を教えてあげるわ、その体に。そこの生徒、覚悟しなさい。 |
 | リン |
え〜、defun って p.36 に説明があるやつね。&optional や &key ってのがあるけど、よくわかんない。 |
 | スー |
それに p.36 では書いていないけど、いえ、馬鹿な読者には見えない文字で書いてあるけれど、実は &rest もあるのよ。知っていたかしら、そこの生徒。 |
 | リン |
えっ、それって隠しコマンドってやつ?で &rest ってなんなの? |
 | スー |
&rest は実引数の残り(rest)をリストにして、仮引数で全部受け取るものよ。つまり、(defun foo (x &rest y) y) と定義して、
(foo 1 2 3 4 5)のように呼び出すと、foo では x は 1 に束縛され、y には残りの (2 3 4 5) が束縛されるのよ。どうかしら、馬鹿な生徒にも、分かったかしら。 |
 | リン |
えーー、それじゃ、&optional も&key も使わないで、全部 &rest でいいんじゃないの?覚えるのが少なくなるし。 |
 | スー |
リン、何を言っているのかしら。まったくリンのくせに急に真面目な質問はしないでほしいわね。まぁ、それはそうだけど、それだと効率が悪いのが分からないかしら。 |
 | プー |
でも ISLisp では &rest しかないかも。これって、手抜きかも。 |
 | スー |
そんなことはないわ。ISLisp は Common Lisp みたいに太らないようにしているだけよ。Multics に対する Unix みたいなものよ。
慈悲の心でわざと省いたのよ。わかったわよね、そこの生徒! |
家庭教師からの帰り道で一人になったスーザン |
 | スー |
なんなのかしら。今日は3人で押しかけて、&rest しか教えられなかったわ。なんてことかしら。それにしてもリンたら、するどいわね。
好きだわ。それにしても、教えてもらっているあの生徒、軟弱でヘタレだわ。私たち3人に押されて一言も話さないなんて。 |
 | プー |
スーちゃん、でもね、あの生徒君も、楽しく勉強していたみたいかも。だってあれから&restばかり書いていたわよ。デスノートに。 |
リスト関数の種類が少ないと思ったスーザン。 |
 | スー |
何も知らない馬鹿なあなたのために、私がリスト関数をもっと教えてあげるわ。感謝しなさい。 |
 | リン |
スーちゃん、図2.7(pp.38-40)のリスト関数のことだよね。えー、あれで少ないの。まだあるの。めんどいな。 |
 | スー |
リン、何を言っているのかしら。あんなものではないわ。リスト関数は色々とあるのよ。だって Lisp なのだから。 |
 | リン |
うー、そうなの?だって car, cdr, cons, append, list, length, member, assoc, acons だけで、お腹一杯だよ。でもなんか、この関数、ばらばらみたい。 |
 | スー |
ばらばらなのは仕方がないことなのよ。だって第3章と第5章で使うリスト関数だけを紹介したのだから。馬鹿な生徒にも覚えられるようにという、私の情けよ。感謝しなさい。 |
 | リン |
うーん、後どれくらい、覚えればいいのよ。 |
 | スー |
(nth index list)は便利よ。list の index 番目を取ってくるのよ。でも実行はのろまで、 O(n)ってことを忘れないでほしいわ。 |
 | リン |
うん、わかった。nth はのろまで愚図だけど、便利な使いパシリと。 |
 | プー |
nth(えぬす) ってなんか発音がすてきかも。Lispって関数名の発音が独特でいいかも。 |
 | スー |
プー、いいところに気が付いたわね。そうなのよ、Lisp は関数名の発音に歴史があるからいいのよ。この良さがあなたに分かるかしら、そこの生徒。それで次のリスト関数は... |
 | プー |
あら、もう帰る時間よ。それに生徒君もなんかぐったりしているようだし。疲れているのかも。 |
家庭教師からの帰り道で一人になったスーザン |
 | スー |
なんなのかしら。今日も、nth しか教えられなかったわ。なんてことかしら。それにしてもプーたら、nth の発音に注目するなんて、するどいわね。
それにしてもあの生徒、何も話さないなんて、軟弱でヘタレだわ。もっと厳しくしないと。 |
 | プー |
スーちゃん、あの生徒君、ちょっと呆れていたのかも。だって3人で来て nth だけなんだもの。・・・でもあの生徒君、実は喜んでいたのかも。 |
シンボルにパッケージの説明がないと思ったスーザン。 |
 | スー |
シンボルについて何も知らない馬鹿なあなたのために、私がパッケージのことを教えてあげるわ。感謝しなさい。 |
 | リン |
スーちゃん、図2.12(p.42)のシンボルのことだよね。でもパッケージってどこにもないよ。あ!「…」で誤魔化しているところなの?ずるい! |
 | スー |
リン、何を言っているのかしら。後で使わないから省いただけよ。それに馬鹿な生徒にはきっと覚えられないから、無駄なだけよ。これはつまり私の情けよ。分かったかしら。 |
 | リン |
うー、そうなんだ。でパッケージってなんなの。Java でも聞いたことがあるような・・・ |
 | スー |
パッケージは名前空間のことなのよ。つまりあなたが住む世界と違う異世界で、名前を付けるということなのよ。
私が付けた素晴らしい名前と、生徒が付けた汚らしい名前が、本当にたまたま同じでも、大丈夫なのよ。分かったかしら。 |
 | リン |
うーん、そうなの。でパッケージにどんなものがあるの?それを知るにはどうすればいいの? |
 | スー |
シンボルのパッケージを取るのは symbol-package でできるわ。たとえば、システムの関数 car のパッケージは#<package common-lisp>よ。
defclass の CLOS 関係は #<package clos>になっているわ。あれ、ちょっとこれは古いわね。今なら common-lisp パッケージよね。
それで庶民が定義したシンボルは#<package common-lisp-user>になるわ。分かったかしら。 |
 | リン |
へぇー、そうなんだ。でも Lisp って平等じゃないの?フラットじゃないの?もしかして、Java なんかのパッケージも Lisp から始まったの?それならすごい! |
 | プー |
うふふ、スーちゃん、良かったね。リンちゃんに Lisp の偉大さが伝わって。・・・でもそれって嘘かも。 |
 | スー |
あら、プーったら、何を言うのかしら。Lisp はすべてのプログラミング言語の祖先なのよ。パッケージもそうなのょ。 |
 | プー |
あれ、声が小さくなっているかも。まぁ、ここはつっこまないでっと。うんうん、スーちゃんとリンちゃんが嬉しいなら、それでいいかも。 |
家庭教師からの帰り道で一人になったスーザン |
 | スー |
今日も、symbol-package しか教えられなかったわ。なんてことかしら。まぁパッケージの概念が少なくとも Common Lisp にあることはリンに伝わったわ。
もっと Lisp のことを洗脳、いえ、啓蒙しなくては。 |
 | プー |
スーちゃん、intern も教えてあげられれば良かったのに〜。でもさっきの大きな声の独り言、リンちゃんのことばかりで、生徒君のことを忘れているかも。 |
等価関数の説明が少ないと思ったスーザン。 |
 | スー |
等価関数が eq と equal しかないと思っている馬鹿なあなたのために、私が等価関数のことを教えてあげるわ。感謝しなさい。 |
 | リン |
スーちゃん、図2.14(pp.43-44)の等価関数のことだよね。あ、確かに eq と equal しか説明していない。もしかして手抜き?駄目なんだぁ。 |
 | スー |
リン、何を言っているのかしら。説明が面倒だから、・・・いえ、後で使わないから省いただけよ。これも記憶容量が少ない生徒のためなのよ。つまり私の温情判決よ。分かったかしら。 |
 | リン |
へぇー、本当?でも今、面倒って言ったよね。言ったよね!で他の等価関数にはどんなものがあるの?さぁ早く白状して。 |
 | スー |
白状って、なにを勘違いしているのかしら。まぁいいわ、私が教えてあ・げ・る。等価関数にはね、eq, eql, equal, equalp があるわ。
数値だけで言えば、= もあるわ。でもこれは代入文じゃないからね。Algol系の言語に毒されている下郎が! |
 | リン |
へぇー、こんなに一杯あるんだ。なんでこんなにあるの?もう覚えきれない。使い分けるのいやだ!やっぱ、eq と equal だけでいい! |
 | スー |
ふふふ、Common Lisp にはこれだけの等価関数があるのよ。関数フェチの人には嬉しい限りかしら。すてきだわ。 |
 | リン |
え、スーちゃんって関数フェチだったの?えー、そうなの?びっくり。 |
 | スー |
関数フェチの話は置いておいて。eq は実は実装依存なのよ。本当にアドレスが一致するかどうかだけを調べているだけの実装依存なの。困ったものだわ。
たとえば、fixnum(固定整数)の実装が即値型でなく、参照型で実装されているとしたら、恐ろしいことに、(eq 1 1) も NIL になってしまうのよ。
この恐怖が馬鹿な生徒でも分かるかしら。 |
 | プー |
それで仕方なく、eql を用意したのかも。(eql 1 1) が T になることを実装に依存せずに、保証しているのよ〜 |
 | リン |
え、プーひゃん、すごい、スーちゃんみたい。プーひゃんも物知りだったんだね。好き! |
 | プー |
いえいえ、それほどでも。あ、スーちゃんがにらんでるかも。ごめんね。それじゃ equalp ってどんな比較をするの?私、知らないかも。 |
 | スー |
えっと、equalp は equal よりももっと比較が大変なのよ。文字列の比較のときは大文字と小文字の区別もしないように比較しなければならないわ。
数型のときはどんな数型でも比較しなければいけないのよ。たとえば (equalp 1 1.0) も (equalp 1 1/1) も T を返すようになっているわ。わかったかしら。 |
家庭教師からの帰り道で一人になったスーザン |
 | スー |
今日はプーに、eql の説明を取られたわ。実装依存になる eq を徹底的に弾劾してやるつもりだったのに、残念だわ。まぁ equalp の説明ができたことで良しとするわ。 |
 | プー |
スーちゃん、さっきはごめんなさいかも。でも関数フェチの話が消えて良かったでしょう〜。ね、関数フェチのスーちゃん。生徒君も目を点にしていたかも。 |
内容紹介の「Webサーバのプログラミング」が気になったプーひゃん。 |
 | プー |
私がお小言をいうの?なんで私なの。スーちゃんの方がぴったりかも。 |
 | リン |
だって、スーちゃんだと地獄絵図になるよ。スーちゃんが本気出すと、みんな、再起不能になるよ。 |
 | スー |
私の名前を勝手に出さないでほしいものだわ。私のイメージが悪くなったら、どうしてくれるのかしら。 |
 | リン |
えっ、イメージ通りだと思うよ。ところでさぁ、 |
 | スー |
イメージ通りって、どういう意味?まぁ、いいわ。ところで、Webサーバって何なの?そのプログラミングって何かしら? |
 | プー |
あ〜あれかも。オンライン書店のことかも。へぇーすごいかも。 |
 | リン |
えーー、そうだったんだ。びっくり。え、でも、そうは見えなかったなぁ。 |
 | スー |
それが問題かしら。Webサーバって言うからは、もっと大げさに、出し惜しみなく、破壊するまで、プログラミングし尽すべきよ。分かったかしら、そこの軟弱もの。 |
 | プー |
こんなにスーちゃんが怒ったから、私はもう叱らなくていいかも。小さなプログラムで作ったから仕方がなかったのかも。 |
 | スー |
え、もう終わりなの。もっと、叱るべきよ。心底、おびえるまで。 |
 | プー |
確かに「なんとLispでWebサーバのプログラミングまで実践します」の「なんと」は言いすぎかも。 |
 | リン |
やっぱ、「なぜか」が良かったんじゃない。 |
Lisp が難しいかもと思ったプーひゃん。 |
 | プー |
Lispって少し難しいかも。超入門を読んでも難しい気がするかも。 |
 | リン |
そうよね。今までのプログラミング言語と全然違う気がする気がする!って絶対違うもん! |
 | スー |
リンはともかく、プーまでもなのかしら? どうして Lisp は難しいと思われるのかしら |
 | リン |
えっ、なんで私はともかくなのよ! 「私でも」難しいと思うのよ、Lispは! |
 | スー |
まぁリンには、超入門では無理だったかしら。仕方がないわね、リンにも分かるように私が教えてあ・げ・る・わ |
 | プー |
わー、すごいかも。スーちゃんが教えるなんて、SICP 以上に超ハードになるかも。 |
 | リン |
えーーやさしくしてね。私、はじめてなのよ。Lisp なんて全く知らないんだから! 怖いよ... |
 | スー |
大丈夫よ。今夜、全部教えてあげるわ。徹底的にその体に叩き込んであげるわ。 |
 | プー |
え、Common Lisp の言語仕様書よりもハードにするのかな。だいじょうぶかな。心配かも。 |
 | スー |
まずは今までのプログラミング言語を全部忘れるのよ。Lisp以外の知識は邪魔なのよ。 |
 | プー |
それはいいかも。x = x + 1なんてことをプログラムしたらスーちゃんにしごかれるかも。 |
 | リン |
それならダイジョブよ。何にも覚えていないから。 |
関数型プログラミング本で、最初のプログラムを読んでいたリン。 |
 | リン |
プログラミング本の最初は Hello, World だよね。なんで fact なの。 |
 | スー |
あら、いいところに気が付いたわね。そこが関数型プログラミングなのかしら。 |
 | リン |
え、どういうことなの?あ、そうか、関数型プログラムって入出力が苦手なのか!この変態の関数野郎が! |
 | スー |
何を毒づいているのかしら。この低能の副作用好き女子が!関数型は再帰から入るものなのよ。お分かりかしら。 |
 | プー |
ねぇねぇ、2人で何を楽しそうに、言葉責めしているのかな〜。 |
 | リン |
あ、プーひゃん、スーちゃんがいじめるんだよ。Hello, World したかっただけなのに。。。ってHello, World を関数型ではどう書けばいいの。 |
 | プー |
まぁまぁ、落ち着いて〜。普通に print でも呼び出したらいいかも。 |
 | スー |
でもそれだと副作用があるわよ。まぁそんなことを気にするのは純粋関数型の信者だけかも知れないけれど。 |
 | リン |
う〜、よくわかんない。Hello, Lisp でいいからさぁ。教えてよ!ねぇ。 |
 | プー |
うふふ、リンちゃん。かわいい〜。それじゃ、色々とスーちゃんにじっくり教えてもらったらいいかも。 |
 | スー |
わかったわ。nil から無限リストまで教えてあげるわ。その体に。 |
学校からの帰り道で一人になったスーザン |
 | スー |
リンたら、Hello, World 教に毒されているわね。最初のプログラムは fact って決まっているのに。でもいいわ。リンに色々と関数型プログラミングのあれやこれやを教えてあげるわ。そして忘れられないようにしてあげるんだから。 |
 | リン |
あの、スーちゃん。何か怖い。。。関数型って足抜けできるんだよね?元の世界に戻れるんだよね。 |
関数型プログラミング本で、破壊的代入の恐怖を読んでいたリン。 |
 | リン |
なんなの、この破壊的代入って。これって普通の代入文のことだよね。それを破壊的だなんて悪意を感じるよ!これはもう関数型の陰謀だぁ! |
 | スー |
あのね、だから代入文は世界を破壊するのよ。分からないのなら教えてあげるわ。その体に徹底的に。 |
 | リン |
もうスーちゃんたら、目が怖い。だってたかが代入文だよ。x = x + 1 みたいな。 |
 | スー |
甘いわ。構文糖衣みたいに甘すぎるわよ。私は1個の代入文で世界が滅びたのを知っているのよ。 |
 | プー |
わ〜、なんかすごいことを言っているのね、スーちゃんは。でも代入文は便利かも。私、好きかも。 |
 | リン |
そうなの、私も代入文は使いたい!それに破壊じゃなくて創造だよ。創造的代入文ってかっこよくない?ね、創造的代入文、万歳! |
 | プー |
え〜なんか、かっこいいかも。創造的代入文なら幸せになれそうかも。 |
 | スー |
駄目よ。そんな言葉に騙されては。あなたたち、本当に馬鹿なの?代入文は世界を滅ぼすのよ。 |
 | リン |
うーん、それじゃ、ローカル変数だけでいいからさ。代入文を使わせてよ。・・・破壊的代入文とやらを。 |
 | プー |
ねぇ、代入文って、左辺値と右辺値を結ぶキューピットみたいかも。 |
 | スー |
もう諦めたわ。代入文クリーナーDを入れるのは。 |
学校からの帰り道で一人になったスーザン |
 | スー |
それにしても何で破壊的代入文が好きなのかしら。あんな野蛮なものを。プログラムを見にくくするし、最適化もしにくくするものなのに。でもリンとの関係は破壊されないから。 |
 | プー |
でも三角関係は破壊的代入文で変えた方がいいかも。 |
関数型プログラミング本で Lisp 言語の最初のページを読んでいたリン。 |
 | リン |
なんで car なの。リストの先頭を取るのは普通は head じゃないの。なんで車なの?意味、わかんない。 |
 | スー |
あら、リンのくせにいいところに気が付いたわね。褒めてあげるわ。 |
 | リン |
うーん。褒められているのかな?まぁいいや。でもどうして car、カーなの。 |
 | スー |
ふふ、car は Contents of Address part of Register の略で、IBM 704... |
 | プー |
わ〜、なんか呪文みたいかも。でもカーってカラスの鳴き声のことかな〜なんて。 |
 | リン |
え、リストの先頭を食べるのはカラスだったんだ。それでクダーはなんなの? |
 | プー |
リンちゃん、それはね、クダーは管(くだ)のことかも。リストの先頭以外を管に突っ込んでおくの〜。 |
 | スー |
2人とも何を言っているのかしら。cdr は Contents of Decrement part of Register のことで... |
 | リン |
ねーねー、でもやっぱ、head と tail だよ。絶対!まぁ、カラスもいいけど。 |
 | プー |
うん、それでも car とするのが Lisp のいいところかも。なんか歴史を感じるかも。世界遺産かも。 |
 | スー |
もう car も cdr を弁護するのは諦めたわ。でも代入文が = よりマシだと思うわ。 |
学校からの帰り道で一人になったスーザン |
 | スー |
それにしても car と cdr でいつも揉めるわね。なんとかしないと、リンが Lisp を嫌いになりそうだわ。
car はカラスでいいとして、cdr は、えーと、残りものだから、どういえば言いのかしら。 |
 | プー |
あ、スーちゃん。それならleftovers (残飯)でどうかな。ふふ、いいかも。 |
関数型プログラミング本で、副作用のページを読んでいたリン。 |
 | リン |
うーん、なんか窮屈。なんで、こんなにストイックなの? |
 | スー |
あら、リン。ストイックなんて言葉を知っていたの、褒めてあげるわ。それで何を愚痴っているのかしら。病気になるわよ。 |
 | リン |
だってグローバル変数は使うな、破壊的代入文は駄目、副作用は恐ろしいって、書いてあるんだよ。なんでこんなに禁欲なのよ。 |
 | スー |
ふふふ、関数型プログラミングは修行よ。修養よ。試練よ。宿命よ。 |
 | プー |
え〜、そんなにがんばらないで、気楽にプログラミングした方がいいかも。ね。スー〜ちゃん。 |
 | リン |
そうよ、スーちゃん。私、修行僧になるの、嫌だぁ!もっと青春したい! |
 | プー |
うふ、いいわね。青春の関数型プログラミング!ねぇ、3人でしましょう。それっていいかも。 |
 | スー |
2人とも、何を言っているのかしら。関数型プログラミングは厳しいの。オブジェクタのように甘えるのは止めなさい! |
 | リン |
え〜、いいじゃん。少しぐらいなら。副作用で遊ぼうよ。ここにちょっとグローバル変数を使おうよ。ね! |
 | プー |
いいわね、このグローバル変数。かわいい名前を付けて、アクセスする関数もかわいくするのもいいかも。 |
 | スー |
え、なに、このキラキラネームのグローバル変数は。私がリネームしてあげるわ、覚悟しなさい。 |
学校からの帰り道で一人になったスーザン |
 | スー |
関数型の道はきびしいのよ。でもリンちゃんには少しぐらい副作用を使わせてあげてもいいけど。 |
 | プー |
スーちゃん、本当はリンちゃんと一緒にデバッグしたいんでしょ。でも関数型をダシにしてはいけないかも。 |
関数型プログラミング本を読んでいて、プログラマの生態が気になったリン。 |
 | リン |
プログラマって、なんでこんなことに拘るの?プログラムが動けばいいじゃん。それで何か文句でもあるの? |
 | スー |
リン、あなたは馬鹿なのかしら。いい?プログラマはプログラムを作る生き物よ。デバッグをする生物ではないのよ。分かったかしら。 |
 | リン |
え、何の話なの。それが拘る理由なの?よく、わかんない。プログラマってプログラムを作っているよりもデバッグが好きなんじゃないの? |
 | スー |
プログラマというのはね、バグを出さないようにするためには、どんなことでもする生き物なのよ。 |
 | プー |
どんなことでもって、どんなことなのかな。あんなことも〜?プログラマってすごいかも。 |
 | リン |
え〜、そうなんだ。プログラマって大変なんだね。バグを出さないためには、あんなこともするなんて。 |
 | プー |
うん、そうかも。おとなしく部屋の隅っこでプログラミングしていたらいいのにね。 |
 | スー |
2人とも何を言っているのかしら。プログラマはバグを出さないためには、プログラミングさえ、しないこともあるってことよ。 |
 | リン |
え〜、プログラマってプログラミングせずに生きていけるものなの?死なないの?大丈夫なの? |
 | プー |
大丈夫かも。プログラマはハッキングできればいいの〜。コンピュータを与えておけば生きていけるかも。 |
 | スー |
肯定したくないけど、そうかも知れないわね。でもバグを出さないプログラミングこそ、プログラマの生き様よ! |
学校からの帰り道で一人になったスーザン |
 | スー |
プログラマはバグを潰す職人ではないわ。バグを出さずにプログラミングする職人なのよ。その覚悟がリンにはあるのかしら。 |
 | プー |
スーちゃん、でもね、デバッグも楽しいかも。それが好きな人が作ったバグなら、しょうがないな〜と言って一緒にデバッグするかも。 |
関数型プログラミング本を読んでいて、プログラマの食事が気になったリン。 |
 | リン |
プログラマって、どんなものを食べているの?プログラミング中におやつはいいの? |
 | スー |
リン、あなたらしいわね。そんなことを気にするなんて。でもプログラマも同じ人間よ。私たちと同じよ。・・・たぶん。 |
 | リン |
え〜そうかな。なんか炭水化物、好きそう。で、おやつにはポテチ。うーん、もっと、おしゃれなものがいい! |
 | スー |
その情報、少し古いわよ。今は彼らも普通よ。でもプログラミング中のフリスク率は高いわね。彼らの常備薬かしら。 |
 | プー |
うふ、問題は夜食かも。朝、昼、夕食は一般人の目もあるから、普通にしているのかも。問題は夜食、うふ。 |
 | リン |
え〜、夜食って太るんじゃないの。大丈夫かな。私がプログラマになっても夜食は食べない!・・・ケーキ以外は。 |
 | プー |
じゃ、今から、お茶にしましょう。でもプログラマは夢中になると食べなくなるって聞いたけど、どうなのかな〜 |
 | リン |
え〜、プログラマって断食するの。そんなの、いやだぁ〜。 |
 | スー |
それはあるかもしれないわ。でも安心して。そのときは彼らの手の届く範囲にコンビニ食やお菓子が散らばっているわ。 |
 | プー |
リンちゃんたら、そんなに悩まなくても大丈夫かも。だって彼らは小太りばかりかも。 |
 | スー |
肯定したくないけど、そうかも知れないわね。ダイエットしなくては。体もプログラムも。 |
学校からの帰り道で一人になったスーザン |
 | スー |
食事もプログラミングで重要かもしれないけど、それよりも重要なのは睡眠よ。プログラマは昼間の会議で居眠りして、夜、如何にがんばるか!なのよ。 |
 | プー |
スーちゃん、でもね、会議中に寝ているのがばれるのは駄目かも。もっとうまくやらないと駄目かも。・・・私みたいに。 |