Scheme 手習い 4 章

読みました、なエントリが投入された旨、連絡が入った。

ええと、github なリポジトリから git pull して中身を見てみる。ちなみに github なナニは git://github.com/hanachin/TheLittleSchemer.git です。
4 章の試験な手続きの一部が以下。

(use gauche.test)
(add-load-path ".")
(load "func")
(load "test-util")

(test-start "chapter 4")

(test-section "atom?")
(eqt (atom? 14) #t)

(test-section "number?")
(eqt (number? -3) #t)
(eqt (number? 3.1415) #t)
(eqt (and (number? -3)
          (number? 3.1415))
     #t)

(f-test
 (add1 [67 => 68])
 (sub1 [5 => 4]
       ;; In practice
       [0 => -1])
 (zero? [0 => #t]
        [1492 => #f])
 (o+ [46 12 => 58])
 (o- [14 3 => 11]
     [17 9 => 8]
     ;; [18 25 => -7]
     )
 (tup? ['(2 11 3 79 47 6) => #t]
       ['(8 55 5 555) => #t]
       ['(1 2 8 apple 4 3) => #f]
       ['(3 (7 4) 13 9) => #f]
       ['() => #t])
 (addtup ['(3 5 2 8) => 18]
         ['(15 6 7 12 3) => 43])

なんか見慣れたらこっちの方が良さげに見えるw
あと、投入されたエントリにて

p80で同じatomかの判定にeq?を使っているがこれだと同じシンボルか判定出来ても同じ数か判定出来ないのでは?(p12参照。実際eq?の引数に数が来てもかまわない、と注釈に書いてはいるが。)eqan?の間違い?

という記述があるんですが p80 な eqan? の以下な定義を指しとるのかな。

;; p.80
(define eqan?
  (lambda (a1 a2)
    (cond ((and (number? a1) (number? a2)) (o= a1 a2))
          ((or (number? a1) (number? a2)) #f)
          (else (eq? a1 a2)))))

同じ数は o= で判定してるのではないかと。
あと_基本関数_云々は分かりません。特殊形式、の意図で基本関数って呼んでるのかもしれないですね。

今後も

マクロなソレについては色々試してみたいとのことなので楽しみです。

追記

コメントももらってるのですが、eqan? ではなくて occur な手続き定義の話だったようです。でもやっぱなんか違和感があるな。
試験が以下なのですが

;; my occur
 (occur ['a '() => 0]
        ['a '(a a a) => 3]
        ['a '(a b c) => 1]
        ['a '(i ro ha) => 0])

eq? と eqan? でどう違うか、とか数値だったらどうかとか確認してみた方が良さげ。なんとなく eq? でも eqan? でも動作は変わらない風に見えるんですが違うのかな。

さらに追記

R5RS によると eq? については

数と文字に対する eq? の振舞は実装依存だが

という記述についての指摘だったようです。
見当違いな指摘だったようで申し訳ないorz

それにしても

読んでないのがモロバレだなぁ。。。