『Scheme手習い』読書会 第1〜3回

友人と読書会をしています。その記録を書いておきたいと思います。

読んでいる本は『Scheme手習い』です。

本の選択は友人におまかせしたので、選択理由は分かりません。200ページ強で文字数も少ないことから察するに、おそらく最後まで読みきれそうな一冊ということでしょう。

さて実はこの読書会は、今日が4日目です。1日目から順に思い出しながら書いておきます。

  • 1日目(1章 おもちゃ)
    • アトム:「(」や「)」以外のアルファベットや特殊記号で始まる文字列、または数字列。
    • リスト:S式を「(」と「)」で括ったもの。
    • S式:アトムまたはリスト(ほかにもあるかもしれません)。
    • 空リスト:「()」。null list。empty list。
    • car:引数に空でないリストを取り、そのリストの先頭のS式を返す。
    • cdr:引数に空でないリストを取り、先頭のS式を除いた残りを返す。
    • cons:引数にS式とリストを取り、S式をリストの先頭に挿入したリストを返す。
    • null?:引数にリストを取り、空リストなら真(#t)を返す。
    • quote:()を評価せず、そのまま返す?「'」でも良い。
    • atom?:Gaucheで試したら未定義なので自身で定義。pair?でなくなおかつnull?でない場合に#tを返す。
    • eq?:引数に数でないアトムを2つ取り、等しい場合に#tを返す。
    • eq?が同値か同一かどちらを見るものかよく分からない。
    • (eq? '() '())は#tを返すが、同じアトムを含むリスト同士だと偽(#f)になる。
    • R5RSを見るとこの本の定義とは違うようで、他の関数も厳密ではなさそう。
  • 2日目(2章 一度、もう一度、さらにもう一度、またもう一度、……)
    • lat?の定義:アトムだけを含むリストなら#tを返す。
    • リストを再帰を使用して走査し各要素をatom?で検査する。
    • define
    • lambda
    • cond, else
    • or
    • member?の定義:指定したアトムがリストに含まれていれば#tを返す。
    • 定義した関数のトレースにページが割かれている。
  • 3日目(3章 偉大なるcons)
    • remberの定義:指定した要素を取り除く
    • consを使用しつつ、リストの中間要素を操作する
    • firstsの定義:リストの中のリストの先頭要素を集めたリストを返す。
    • 間に空リストがあった場合などの例外は考慮していない。
    • secondsの定義:リストの中のリストの2番目の要素を集めたリストを返す。
    • insertRの定義:指定した要素の右側に要素を追加したリストを返す。

追記:『Scheme手習い』読書会 第4回