休みと言いつつ

手が動く。

練習問題

p.74 のナニ。

gosh> (l)
()
gosh> (l 1)
(1)
gosh> (l 1 2 3)
(1 2 3)

って出力される手続きを、との事。最初は

(define l (lambda (x . y) (cons x y)))

で OK? って思ってたら

gosh> (l)

がダメ。上記の書き方だと一つ以上引数が無いと gauche に叱られる。0 以上ってどうやるんだっけ、と言いつつ同じページの直上にヒント。

(define l (lambda x x))

で OK らしい。あるいは

(define (l . x) x)

でも OK な模様。うーん。図示とかしてあって分かりやすいなぁ、と言いつつ SICP なソレってどうなってたんだっけ、という事に思い至る。

むむ

なんとなくヤッてしまう any-pred と every-pred ですが ...
positive-integer? の定義とかを見てるとこれらが戻す手続きは引数一つとみれば、ガワって以下なカンジ ?

(define my-any-pred
  (lambda x
    (define my-any-pred-iter
      (lambda (y)
	))
    (lambda (l) (my-any-pred-iter l))))

なんか微妙な風味ながらも続けてみかけて違う事に気づく。でリトライした結果が以下。

(define my-any-pred
  (lambda x
    (define my-any-pred-iter
      (lambda (x y)
	(cond ((null? x)
	       #f)
	      (((car x) y)
	       #t)
	      (else
	       (my-any-pred-iter (cdr x) y)))))
    (lambda (l) (my-any-pred-iter x l))))

で、

gosh> (define xxx (my-any-pred zero? even?))
xxx
gosh> (xxx 1.1)
*** ERROR: integer required, but got 1.1

って叱られて解が微妙? って思ってたら even? に実数渡しちゃ駄目なのでした。書き方微妙ですが一応動いてる模様。

これ

大人しく読むのが微妙なのでニゲてる感満点ですね ...
しかもヒリ出た解が今一つ?