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>