Lispで遊ぼう!(2)分かりにくいLispイジハピ!TwitterID:@query1000こと深沢千尋のブログです。♡さいきんブログの評判が意外と気になるようになってきました。Lispで遊ぼう!(2)分かりにくいLispカテゴリ俺とEmacsquery1000Comment(0)Trackback(0)今週もLispを勉強していた。Lisp』(クォリティ刊)は一応読み終わった。1997-10Amazon楽天市場Yahooショッピング120ページぐらいの本を、10日以上掛けて読んでいる。書いてあるコードを全部試して、不明な点を他の本やWebで調べていたらそうなった。上の本は、短くするためにずいぶん圧縮していて、書いていることを100%理解しようと思ったら時間が掛かる。いまは2冊目の山本和彦さん著『リスト遊び』に掛かっている。2000-05Amazon楽天市場Yahooショッピングやはり薄く、濃く、難しい本だが、上の本よりもずいぶん読みやすい。下の本の方が内容を絞ってあるからだとも思うが、上の本を読んである程度Lisp力が上がっているのだ。一度上の本を再読するとまた分かることがあるかもしれない。それにしても、Lispは難しい。言語自体が難しいところがある。アトムとatom関数まず、数値や文字列のような「リストでないデータ」のことをアトム(atom)と言う。アトムは原子のことで、これ以上分かれないもの、と言うほどの意味である。Modeで、「9」という式をC-j(Ctrl+J)で評価したら、9という値を返した、ということである。【C-j】はそういう文字列ではなく、コントロールJの押下を表す。atomという関数があって、引数がatomだったらt、でなかったらnilを返す。"akb48")【C-j】tほらね!でもnilを返す場合も対照に見せないと本当のところは分からない。tはtrueの略で、読み方はティーでいいと思う。nilは空リスト(からりすと)のことで、()と同値であるが、読み方はニルでいいのだろうか。ラテン語で「無」のことらしい。★★★こういうのがむずかしいと感じる。(1回目)ちなみに、tもnilもatomで評価するとtを返す。nil)【C-j】tnilとnull関数もう出てきたが、要素がゼロ個のリストを空リストと言う。()とも書くが、nilとも書く。nil【C-j】nil()【C-j】nilnilかどうか判定する関数がnullである。引数がnilだったらtを返す。なかったらnilを返す。nil)【C-j】tnullはヌルと読みがちだが、それはドイツ読みで(ドイツで007のことをヌルヌルジーベンと言うらしい)、英語的にはナルだと思う。(「非Aの世界」と書いて「ナルエーのせかい」と読ませる小説もあった。複数の値をカッコ()で括ったものをリスト(list)と言う。Processorというぐらいで、リストを基本にした言語である。リストをそのまま評価すると怒られる。1))1という不当な関数が現れた、と言われている。3が引数として渡されたことになるからだ。引数リスト)と書くのだ。★★★こういうのがむずかしいと感じる。(2回目)で、リストをそのまま評価するにはクォートを書く。form、特殊関数とも)というものの略記法だが、ここでは深く触れない。あるものがリストであるかどうかはlistp関数で評価出来る。tはリストではない読み方はリストピーでいいのだろうか。listpのpはpredicateのpで、述語という意味だそうだ。言われても良く分からない。基本的に「~かどうか」という関数のときは、pをつけるようだ。★★★こういうのがむずかしいと感じる。(2回目)ところが、atomかどうか判定する関数は、atompではなくてatomなのだ。考えたが、listという関数がすでにあるから、という理由のようだ。引数を使ってリストを作る関数である。3))【C-j】tアトムかどうかは、atom。リストかどうかは、listという関数がすでにあるから、listp。★★★こういうのがむずかしいと感じる。(3回目)で、nilかどうかを判定する関数は、nilでも、nilpでもなく、nullなのである。★★★こういうのがむずかしいと感じる。(4回目)俺だったら、アトムかどうかはatomp、ヌルかどうかはnilp、リストかどうかはlistpにするがどうか。(pがいいかどうかは良く分からない。checkでcにすればいいかもしれない(atomc、listcなど)が、createとカブるから分かりにくいかもしれない。)さて、アトムとリストは対立概念であるように思われる。実際にはそうではない。nilはatomでもあるし、listでもあるのだ。nil)【C-j】t★★★こういうのがむずかしいと感じる。(5回目)まあこれは「無」とは何かみたいな話で、もともと難しい話だからしょうがないところがあるのだろうか。セル、cons関数、consp関数さて、セルというデータ構造もある。(consセルとか、コンスセルとか書くこともあるが、これ以降はセルと言う。)セルは2つのポインタを持つデータで、cons関数で作る。2)consはコンスと読み、constructs(構築する)の略である。★★★こういうのがむずかしいと感じる。(5回目)上に出てきたが、セルは2つのデータをピリオドで挟んで作ることも出来る。これはcons関数の略記法であり、ドット記法とも言う。2)とだけ書いて評価すると「不当な関数1」と怒られるので、クォートする。consかどうか判定する関数がconspである。読み方はコンスピーでいいのだろうか。9はセルではないCARとCDRセルは、二つのデータへのポインタを持つデータ構造だが、この前の方をCARと書いて、カーと読む。後の方をCDRと書いてクダーと読む。(CD-R(書き込み可能コンパクトディスク)とは何の関係もないので注意。)あるセルのCAR部を取り出すにはcar関数を、CDR部を取り出すにはcdr関数を使う。2))【C-j】2CARとCDRの語源については、以下のWeb記事に詳しい。Register)が使用された.コンテンツ・オブ・アドレス・パート・オブ・レジスターの略で、CAR。コンテンツ・オブ・デクリメント・パート・オブ・レジスターの略で、CDR。