「Scheme手習い」は面白い!イジハピ!TwitterID:@query1000こと深沢千尋のブログです。♡さいきんブログの評判が意外と気になるようになってきました。Lispで遊ぼうの連載。Lispと連呼するのは面倒なので、今後はElispと呼ぶ。読みかけていた「初めての人のためのLISP」は挫折した。2010-03-10Amazon楽天市場Yahooショッピング第7講で「今は使われていないprog」という構文が「もしあったら」という前提で延々プログラム例が出てくるのには少々びっくり。脳内で実行しなければならないのである。この本を褒めている人は、よく考えたら「他の本でLISPを極めている人が、楽しみのために読み返しているケースが多いのではないか。ぼくも他の本で勉強したら、またこの本を再読することを期して、とりあえず本書は自宅のスミソニアン博物館に貯蔵しておくことにする。警句が書いてあって、示唆に富む本ではあると思った。Schemer)」を読み始めた。2010-10-22Amazon楽天市場Yahooショッピング本書は、以前読んで感銘を受けた山本和彦さんの「リスト遊び」の「あとがき」で、本書を読んだ後に読むべき本として挙げていた。2000-05Amazon楽天市場Yahooショッピングさっそく読んでみようと思ったのだが、問題が一つあって、プラットフォームがSchemeなのだ。ぼくの勉強したいのはElispである。ここは両方勉強し、移植してみて、どういう齟齬が起きるか、発見するのも一方だと思った。SchemeとElispの違いが分かって、いいのではないか。'atom)tである。Lisp)はこれでいいのだが、Schemeの場合はatom?という関数を使えと書いている。ところが、Gaucheでatom?を使ってみると、使えないのである。Trace:_______________________________________これは実は「はじめに」に書いていることであって、このように定義する。x)))))atom?実行してみる。'atom)#t出来たー。'()のcarを取ることは出来ない、と書いている。'())nilとなる。nil)NILとなる。Trace:_______________________________________となった。関数carは空でないリストに対してのみ定義される。(初めての人のためのLispより)ワシは少なくともnilのcarがnilになるのはどうも好かん。~実際のプログラムを書くとき、nilのcdrがnilになってくれたほうが、プログラムがちょっと短くなってうれしいときもあるが、nilのcarを取るという行為はそもそもプログラムの論理の誤りであることが圧倒的に多いからじゃ。関数cdrは空でないリストについてのみ定義される。空でないリストのcdrは常に別のリストとなる。Trace:_______________________________________とある。ところがElispでは、nilのcdrも取れて、nilになる。'())nilさて、「Scheme見習い」にはcons関数の第2引数はリストでなければならないとあるが、実際にはアトムでも良い。アトムの場合は、ドットリストを返す。b)これは、訳注にも「実際には出来る」的なことが書いている。その後に、本文に「Consの掟」というものが書いているが、ということで、実際には例外がある。関数consは2つの引数を取る。consの第2引数はリストでなければならない。=>実際には第2引数はアトムであっても良い。結果はドットリストとなる。アトムのnullを取ることは出来ないと書いているが、実際には取ることが出来る。Elispではnil、Gaucheでは#fを返す。関数null?はリストに対してのみ定義される。=>実際にはアトムに対して掛けることも出来る。この場合nilや#fを返す。これも脚注に書いている。アトムとリストを比較できないと書いているが、実際には、出来る。同じリストを比較すると真を返す。違うリストを比較すると偽を返す。リストとアトムを比較すると偽を返す。関数eq?は2つの引数を取る。どちらも数でないアトムでなければならない。=>実際はリストも比較できる。これも脚注にも書いてある。まとめると:「Scheme手習い」には使えると書いているが、実際には定義しなければならない:・atom?(「はじめに」に書いている)「Scheme手習い」にはできないと書いているが、実際には出来る(脚注に、実際には出来ると書いている):・第2引数にアトムを取るcons関数=>ドットリストを返す・アトムを引数に取るnull?関数=>偽(Elisp、Clispではnil、Schemeでは#f)を返す・アトムとリストを引数に取るeq?関数=>偽を返すSchemeとElispの仕様の違いによって、Schemeでは出来ないが、Elisp/Clispでは出来る:・nilのcar・nilのcdr=>両方ともSchemeではエラー、Elisp/Clispではnilという注意点がある。★このブログの下書きを書いているのはずいぶん前であって、「Scheme手習い」はだいぶ読み進んでいる。この本は面白い!ゲーミフィケイションにあふれた、実用的な脳トレのようなものである。この本のすばらしさを今後おいおい紹介していく。やさしい本なので、万人におすすめである。