AI に質問して提示したプログラムがこれ。
(define (stream-cons a b) (cons a (delay b))) (define (stream-car s) (car s)) (define (stream-cdr s) (force (cdr s))) (define (stream-filter p s) (cond ((null? s) '()) ((p (stream-car s)) (stream-cons (stream-car s) (stream-filter p (stream-cdr s)))) (else (stream-filter p (stream-cdr s))))) (define (stream-enumerate-integers n) (stream-cons n (stream-enumerate-integers (+ n 1)))) (define (sieve s) (stream-cons (stream-car s) (sieve (stream-filter (lambda (x) (not (= (modulo x (stream-car s)) 0))) (stream-cdr s))))) (define primes (sieve (stream-enumerate-integers 2))) (display (stream-car primes)) (newline) (display (stream-car (stream-cdr primes))) (newline) (display (stream-car (stream-cdr (stream-cdr primes)))) (newline)
まず最後の display 以降はプログラムの実行なので、コメント付きで書いてくれないかな?
あと実行例だよということをコメントで書いてくれない?
;;; おい人間、ここ以降はテスト実行用や。 ;;; コメント付けとくから、外して実行してな。 ;;(display (stream-car primes)) ;;(newline) ;;(display (stream-car (stream-cdr primes))) ;;(newline) ;;(display (stream-car (stream-cdr (stream-cdr primes)))) ;;(newline)
こんな風にさ。(どうして関西のおばちゃん風なのかは謎)
いや、自分は人間なんでコメント無くても理解できたけどさ。
まさか、試されているのか・・・・・?
人間ならそれぐらいわかって当然やろ的な?w
そんなワケないかwww
結構バカだけど、一応人間だからな。見くびるでないぞ、AI よ。
お前よりは数段賢い。(はず)
惜しいなー。*1
このプログラムは応答なしになりますw
なぜかというと、stream-cons は通常の手続きなので、引数 b は、stream-cons 手続きに渡す前に評価されてしまうから。
つまり stream-cons 内で delay を書いても意味ないのである。通常の手続きにおいては。
その事を AI に指摘した結果、理解できたらしい。修正プログラムを提示してきた。
1 回目の提示プログラムは間違っていたので割愛するけど、
さらに同様の指摘を繰り返すと、さらにプログラムを提示してきた。
(define-syntax stream-cons (syntax-rules () ((_ a b) (cons a (delay b))))) (define (stream-car s) (car s)) (define (stream-cdr s) (force (cdr s)))
マクロを使ってきたw
や、やるじゃん。
これなら、うまく動作する。
以下テスト結果。
gosh> (stream-car primes) 2 gosh> (stream-car (stream-cdr primes)) 3 gosh> (stream-car (stream-cdr (stream-cdr primes))) 5
*1:ていうか、テストしてきちんと動作するか試せよ。おまえはよw