『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章 一度、もう一度、さらにもう一度、またもう一度、……)
- 3日目(3章 偉大なるcons)
- remberの定義:指定した要素を取り除く
- consを使用しつつ、リストの中間要素を操作する
- firstsの定義:リストの中のリストの先頭要素を集めたリストを返す。
- 間に空リストがあった場合などの例外は考慮していない。
- secondsの定義:リストの中のリストの2番目の要素を集めたリストを返す。
- insertRの定義:指定した要素の右側に要素を追加したリストを返す。