2012-01-28 3 views
0
; 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. 

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

ответ

3

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

+0

Спасибо, что именно. – zallarak

Смежные вопросы