Implementazione del flusso di schema

4

Dopo avermi fatto strada attraverso SICP ho deciso di lavorare anche se alcuni Project Euler problemi usando lo schema. In questo particolare problema sto provando a generare un flusso infinito di interi, tuttavia sto ricevendo un errore dall'interprete del Schema del MIT.

;Aborting!: maximum recursion depth exceeded

Questo mi porta a credere che l'implementazione del mio stream non sia corretta, tuttavia dopo aver confrontato il mio codice con quello del libro non trovo errori.

(define (delay x)
  (lambda ()
    (x)))

(define (force x)
  (x))

(define (cons-stream a b)
  (cons a (delay b)))

(define (car-stream s)
  (car s))

(define (cdr-stream s)
  (force (cdr s)))

(define (integers-starting-from n)
  (cons-stream n (integers-starting-from (+ n 1))))

L'errore si verifica quando eseguo il seguente codice:

(define n (integers-starting-from 1))

Dove ho sbagliato?

Modifica

Grazie a Chris Jester-Young qui sotto ho lavorato ora. La corretta implementazione di delay e stream è la seguente.

(define-syntax delay
  (syntax-rules ()
    ((delay expr)
     (lambda ()
       (expr))))

(define-syntax stream
  (syntax-rules ()
    ((stream a b)
     (cons a (delay b)))))
    
posta Garee 24.07.2011 - 18:48
fonte

2 risposte

6

Sia delay che cons-stream devono essere macro; altrimenti la tua chiamata ricorsiva non verrebbe veramente posticipata.

    
risposta data 24.07.2011 - 19:19
fonte
3

Un altro modo per correggere il codice è incorporare la chiamata ricorsiva a integers-starting-from in lambda :

    (define (integers-starting-from n)
      (cons-stream n (lambda () (integers-starting-from (+ n 1)))))

Questo ti permette di mantenere le definizioni di delay e cons-stream così come sono in SICP.

    
risposta data 28.05.2012 - 10:39
fonte

Leggi altre domande sui tag