SICP問題3.74
符号の変化を検出器する手続き
(define (sign-change-detector after before) (cond ((and (< before 0) (>= after 0)) 1) ((and (>= before 0) (< after 0)) -1) (else 0)))
いんちきsense-dataの定義
(define test-list (list 1 2 1.5 1 0.5 -0.1 -2 -3 -2 -0.5 0.2 3 4)) (define (make-sense-data org-list rest) (if (null? rest) (cons-stream (car org-list) (make-sense-data org-list (cdr org-list))) (cons-stream (car rest) (make-sense-data org-list (cdr rest))))) (define sense-data (make-sense-data test-list test-list))
Alyssa版のmake-zero-crossings(教科書で定義)
(define (make-zero-crossings input-stream last-value) (cons-stream (sign-change-detector (stream-car input-stream) last-value) (make-zero-crossings (stream-cdr input-stream) (stream-car input-stream)))) (define zero-crossings (make-zero-crossings sense-data 0))
実験
(stream-ref-range zero-crossings 0 20) ; 0 ; 0 ; 0 ; 0 ; 0 ; -1 ; 0 ; 0 ; 0 ; 0 ; 1 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; -1 ; 0 ; #<undef>
Alyssaの上司のEva Lu Ator版のmake-zero-crossings
(define zero-crossings (stream-map sign-change-detector sense-data (cons-stream 0 sense-data)))
実験
(stream-ref-range zero-crossings 0 20) ; 0 ; 0 ; 0 ; 0 ; 0 ; -1 ; 0 ; 0 ; 0 ; 0 ; 1 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; -1 ; 0 ; #<undef>