始めて仕様書を読んだ日

金曜日の夜の事ですが ふとした事であるヒトに除数の探索の勉強について
その後どうなったのかという内容の事を聞かれました
その時にid:nyaxtさんがSICPircを教えてくれました
nyaxtさんのブログにも書いてあるのですがこちらでも告知しちゃいます☆

SICPのオンライン勉強会を金曜夜22:00~24:00まで、定期的に開催しています。
興味のある方は、いきなりでいいので、IRCのチャンネルまでお越し下さい。

     #sicp-seminar-online @ irc.freenode.net
     ログは公開しています:http://irc.nyaxtstep.com/sicp
   詳しくはこちらhttp://d.hatena.ne.jp/nyaxt/20080630#1214829553

最初はnyaxtさんのustを見ていたのですが見ていてもよく分からないので
自分のSICPの復習や予習をしていました
その時に私がやっていたのがフェルマーテストでほとんど全部コード
理解出来てなかったんです(今現在もその状態が続く・・・)
質問とかしたりしてたのですがやっぱり理解出来てないので
とりあえずフェルマーの小定理から離れてみる事にしました
その時にid:nishiohirokazuさんとnyaxtさんが何かを会話していて
私は???だったので何もそれについて触れなかったんですけど
西尾さんが私のために解説してくれました

 <nishio> yukkyのために今の話題をもう一回書くと
 <nishio> (else + 1 2)は正しいでしょうか
(捕捉コード)
 (cond ((= 1 2) "dummy")
 	  (else + 1 2))
<yukky> 正しいんじゃない?
(↑確証もなく勘で話してます・・・φ( ̄  ̄|||) )
 <nishio> (else * 2 3)はcondの最後に書いてあって、
 <nishio> かつ他の条件が#tにならなかったとき
 <nishio> 最終的にいくらを返すでしょう
 <yukky> (else * 2 3)の時?
 <nishio> うん
 <yukky> 3かな
(↑今考えてみると良く正解したなぁ・・・φ( ̄  ̄|||) )
<nishio> 正解
<nishio> で、
<nishio> その理由は?
<nishio> なんで掛け算した6にならないの?
<yukky> 最初はやっぱり6だと思ったのね
<yukky> でも
<yukky> 前の除数の探索のところで
<yukky> 似たような条件があって
<yukky> そこで
<yukky> (* 3 2)
<yukky> を当てはめて考えてみたのね
<nishio> うんうん
<yukky> 3に*2したものが答えなんだろうけど
<yukky> この場合は条件が分からないので
<yukky> それならこの
<yukky> 3に*2間違った><
<yukky> 3だけを返すと思ったんだ
<yukky> だから答えは3
(↑今見てみると勘違いしてたと思われます・・・φ( ̄  ̄|||) )
<nishio> 条件がわからないってどういう意味?
<yukky>  (define (find-divisor n test-divisor)
<yukky>  (cond ((> (square test-divisor) n) n)
<yukky>  (( divides? test-divisor n) test-divisor)
<yukky>  ( else (find-divisor n (+ test-divisor 1)))))
<yukky> 具体的にはこの式で考えてたんだけど
<yukky> (+ test-divisor 1)
<nyaxt> しかし(else 〜がlistの最後の要素を返す理由は謎だなぁ。
マクロ展開かなんかに解があるんだろうか?
<nishio> 暗黙のbegin > nyaxt
<yukky>  test-divisor に1を加えたものが答えだけど
<yukky>  でもさっきの式の場合は
<yukky>  elseの部分を返すと分かってるので
<yukky>  3かなぁと。。。。
(↑意味不明な事書いてるのでやっぱり勘違い・・・φ( ̄  ̄|||) )
<nyaxt>  nishio: ちょう納得したthx
<yukky>  暗黙のbeginだけで納得するの???><
<nishio> っ[上野氏は天才]
<yukky>  そーだよね。。。。
<nishio> (cond ((= 1 2) "dummy")
<nishio> 	(else (* 2 (+ 1 2))))
<nishio> これはいくらを返すでしょう
<yukky>  3じゃないの。。。。??
<yukky>  きゃーーー><
<yukky>  このタイムが怖い><
<nishio> ドキドキして待ってないで実行してみれば済む話なのだけど
(↑テンパってて思いつきもしませんでしたよ・・・φ( ̄  ̄|||) )
<nishio> 不正解
<yukky>  実行してみるー!
<nishio> ところでSchemeのコードってどうやって実行している?
<nishio> goshを使ったんだけどカーソルが移動できなくて不便だった
<yukky>  gosh使ってるー!
<nishio> エディタで編集してから実行?
<yukky>  そのままターミナル。。。。
(↑基本直打ちなんですけど都合によりgosh.vimなど適当に使っています)
<yukky>  使いづらいのは確かなんだけどねー。。。
(↑goshはインタプリンタなのでコンパイラーの方が便利かも)
<nyaxt>  goshにreadlineサポートってつけられないんだろうか
<nyaxt>  gosh-rlというのをみつけた
<nishio> おお
<nyaxt>  おー
<nyaxt>  きくようになった
<nyaxt>  すげー
<yukky>  gosh> ( cond (( = 1 2) "dummy" ) 
             (else ( * 2 ( + 1 2))))
<yukky>  6
<yukky> なんでー><
<nishio> ( cond (( = 1 2) "dummy" ) (else * 2 ( + 1 2)))
<nishio> これはいくらでしょう
<yukky>  gosh> ( cond (( = 1 2) "dummy" ) 
                 (else * 2 ( + 1 2)))
<yukky>  3
<yukky>  あってないわけないよ。。。ね??
<nishio> 結果は僕の期待通り
<nishio> さてその二つの式の違いは何でしょう
<yukky>  括弧かなぁ〜〜〜なんて。。。。。><
<yukky>  ( * 2 ( + 1 2))
<yukky>  ココを評価して6
<yukky>  * 2 ( + 1 2)
<yukky>  間違い
<yukky>  ( + 1 2)
<yukky>  ココを評価して3
<yukky>  なのかなぁと。。。
<yukky>  違いは括弧以外見えないなぁ><
<nishio> そう
<nishio> 間違いというか、
<nishio> (else x y z)って書いてあったら、
<nishio> xを評価して、yを評価して、zを評価して
<nishio> 最後にzを返す
<nishio> xが*であっても同じこと。
<yukky> じゃあこの場合は
<yukky> (else * 2 ( + 1 2))はいいとして
(↑正しくは (else (* 2 ( + 1 2)))だと思う)
<yukky>  (else * 2 ( + 1 2)
(↑正しくは (else * 2 ( + 1 2)) 括弧が1コ足りない>< )
<nishio> これは(begin x y z)と同じ挙動、ってわけで
さっきnyaxtには「暗黙のbegin」って言った。
<yukky>  暗黙のbegin?
<yukky>  (else ( * 2 ( + 1 2))
<yukky>  ココはやっぱいいけど
<yukky>  (else * 2 ( + 1 2))
<yukky>  括弧がないくらいで
<yukky>  評価が違いすぎる><
<yukky>  * 2
<yukky>  この部分をスルー??
<nishio>  gosh> (cond ((= 1 2) "dummy")
             (else * (display 1) (+ 1 2)))
<nishio>  13
<nishio> 括弧がないくらいで!Schemeは括弧が超重要!!
<nishio> 他の多くの言語だと括弧がちょっとよけいでも大丈夫だけど、
 Lispya
<nishio> LispやSchemeは括弧がよけいにあってもエラーになる
厳しい言語ですよ
<yukky>  ><
<yukky>  (else * (display 1) (+ 1 2)))
<yukky>  これって
<nishio> 括弧重要括弧重要 大事なことなので二度言いましたよ
<yukky>   1と3をくっつけたので13?
<nishio> うん
<yukky>  括弧重要!
<yukky>  じゃあやっぱりさっきの
<yukky>  (else * 2 ( + 1 2))は?
<yukky>  括弧抜けてるけど
<yukky>  どうして3という評価になったのか
<yukky>  そこものすごく重要!
<nishio> うん
<yukky>  西尾さん。。。。><
<yukky>  暗黙のbeginって一体。。。
<nishio> ん?
<yukky>  この評価の違いが分からなかったら
<yukky>  悩まし過ぎて何も手につかないよー><
<nishio> R5RSって見たことある?
<yukky>  ない!!!
<nishio> http://www.unixuser.org/~euske/doc/r5rs-ja/
<nishio> PDFを今すぐダウンロード
<nishio> で、beginの所とcondのelseの所を読む
<nishio> 最初はいまいちわからないかもしれないけど。
<yukky>  もうダウンロードした!
<yukky>  beginのところって
<yukky>  何章のドコ?
<nishio> 検索
<yukky>  ゴメン><
<yukky>  ちょっとしたらすぐに検索に気付いた><
<yukky>  もし cond 式が末尾文脈にあって,(<式1 > => <式2 >)
<yukky>  という形式の節をもつならば,<式2 > の評価から結果と
<yukky>  して生ずる (暗黙の) 手続き呼出しは末尾文脈にある。
<yukky>  <式2 > それ自身は末尾文脈にはない。
<yukky>  よく分かんないけどこういうことなのかなぁ?
<nishio> beginの方も読んだ?
<yukky>  うん
<yukky>  (begin <末尾列>)
<yukky>  (do (<繰返し仕様>*)
<yukky>  (<テスト> <末尾列>)
<yukky>  <式>*)
<yukky>  ただし
<yukky>  <cond 節>
<yukky>  −→ (<テスト> <末尾列>)
<yukky>  <case 節>
<yukky>  −→ ((<データ>*) <末尾列>)
<yukky>  <末尾本体>
<yukky>  −→ <定義>* <末尾列>
<yukky>  <末尾列>
<yukky>  −→ <式>* <末尾式>4.1.1. 変数参照
<yukky>  <変数> 構文
(↑この部分だろうと思う箇所を全てコピペで貼ってます・・・)
<nishio> それ見てもわからないでしょ
(↑その通りです・・・φ( ̄  ̄|||) )
<nishio> もしすべての <テスト>
<nishio> が偽値へと評価されたとき,else 節がなければその条件式の
<nishio> 結果は未規定であるが,else 節があればその各 <式> が評価
<nishio> されてその最後の式の (1個または複数個の) 値が返される。
各 <テスト> 式が左から右へと評価され,真値 (6.3.1 節参
<nishio> 照) へと評価された最初の式の値が返される。
<nishio> (begin <式> <式> . . . ) ライブラリ構文
<nishio> 各 <式> が逐次的に左から右へと評価され,最後の <式> の
<nishio> (1個または複数個の) 値が返される。この式型は,入出力
<nishio> などの副作用を順序どおりに起こすために使われる。
<nishio> このPDF、コピペしにくいな。
<yukky>  もしすべての <テスト> が偽値へと評価されたとき
<yukky>  っていうのがさっきのダミーで
<yukky>  else 節がなければその条件式の 結果は未規定である
<yukky>  なんだけどelseがあったので定義出来ました
<yukky>  その最後の式の (1個または複数個の) 値が返される
<yukky>  っていうのはなんとかわかったけど
<yukky>  じゃああの括弧が抜けていたことで
<yukky> 何が起こったんだろう。。。。?
<nishio> (else (+ 1 2))は
<nishio> 一番外のリストにいくつものが入っている?
<yukky>  2個
<yukky>  3個だ!!
<nishio> 一番外
<yukky>  (else (+ 1 2))はelseしかないから0かなぁ??
<nishio> ( ) <-中身が0個のリスト
<yukky>  空リスト?
<nishio> 0ってことはないよね
<yukky>  (else)←中の括弧を抜いた
<yukky>  と見たら
<yukky>  1コなのかなぁ
<yukky>  elesだけが入ってるリスト
(↑ボケボケだぁ><)
<nishio> NO
<yukky>  分かった!
<yukky>  2個だ
<yukky>  (else)で1コ
<yukky>  (+ 1 2)
<yukky>  で1コ
<yukky>  合計2個
<nishio> あ
<nishio> 正解
<nishio> で(else + 1 2)は何個だ
<nishio> 1コかな!
<nishio> ちがう
<yukky>  なんでだろう??
<yukky>  単純に
<yukky>  else  + 1  2で4個?
<nishio> うん
<nishio> じゃぁ、それぞれの「最後の式」ってどれだ
<yukky>  (else (+ 1 2))で言ったら
<yukky>  (+ 1 2))
<yukky>  (else + 1 2)で言ったら
<yukky>  左から評価していくから
<yukky>  最後は2かな
<nishio> うんうん
<nishio> 正解
<yukky>  良かったぁw
<yukky>  じゃあさっきの式に当てはめていくと
<yukky>  ( cond (( = 1 2) "dummy" ) (else * 2 ( + 1 2)))
<yukky>  これが3を返すのは今の理屈といっしょだね!
<nishio> うん
<nishio> 正解
<yukky>  (else ( * 2 ( + 1 2))))とは評価の仕方が違うものね
<nishio> うんうん
<nishio> よく出来ました
<yukky>  良かったw
<yukky>  すっきりしたw
<yukky>  実は内心ドキドキしながらいろいろ考えてたw

長くなりましたがこんな感じでずっとチャットしたり考えたりしていました
上のチャットで括弧内に書かれてるのは私の気持ちだったりしますw
優しく丁寧に教えてもらったのでまた1コ問題が減りました☆
nyaxtさん西尾さん本当にどうもありがとうございました(´>人<`)
その後朝くらいまでSchemeの仕様書であるR5RSを分かりそうな部分だけ
目を通していました
R5RSを読んでいてR5RSが何かに似ているなぁと思ったんですがそれは
[携帯の取扱説明書]でしたw
皆さんの感覚とはずれているかもしれませんが・・・(」。≧□≦)」
始めてプログラミング言語の仕様書を読んだ日はとっても楽しい夜でした♪
また金曜日にオンラインでSICP勉強しますd(^^*)