Проблема при отображении последовательных элементов бесконечного потока - PullRequest
0 голосов
/ 28 января 2012
; defining stream-for-each
(define (stream-for-each proc s)
  (if (stream-null? s)
      'done
      (begin (proc (stream-car s))
        (stream-for-each (stream-cdr s)))))

; Defining a method to display the stream
(define (display-stream s)
  (stream-for-each display-line s))

(define (display-line x)
  (newline)
  (display x))

; Creating a stream that uses Newton-Raphson
; method to find the Square Root of 2
(define (sqrt-improve guess x)
  (avg guess (/ x guess)))

(define (sqrt-stream x)
  (define guesses
    (cons-stream 1.0
                 (stream-map (lambda (guess)
                              (sqrt-improve guess x))
                             guesses)))
  guesses)

Теперь проверяем это ..

=> (stream-ref (sqrt-stream 2) 11)
Value: 1.414213562373095

Так что кажется, что поток работает правильно;однако, когда я пытаюсь отобразить это:

=> (display-stream (sqrt-stream 2))
1.
;The procedure #[compound-procedure 13 stream-for-each] 
has been called with 1 argument; it requires exactly 2 arguments.

Из того, что я вижу, вызывается поток для каждого с двумя аргументами, но я должен что-то упустить.Буду признателен за любые разъяснения.Код взят из: http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-24.html#%_sec_3.5.3

1 Ответ

3 голосов
/ 29 января 2012

Вы просто пропускаете аргумент в рекурсивном вызове (stream-for-each (stream-cdr s)).Ваша функция stream-for-each имеет контракт procedure? stream? -> 'done, но вы предоставили ей только поток (именно об этом говорит ошибка).

...