0
votes

I'm trying to implement streams for an assignment, and I'm missing something important.

This stream-cons should be creating a pair which is a value and a promise for the cdr (to be evaluated later) ..

(define (str1) (stream-cons 1 2))

However, when then I call (stream-car str1) and it complains "contract violation expected: pair?"

I don't understand why str1 is not a valid pair -- what do I do to make this work?

Rob

#lang racket

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

(define (force delayed-obj)
  (delayed-obj))

(define-syntax stream-cons
  (syntax-rules() ((stream-cons x y)
                   (cons x (delay y)))))

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

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

(define the-empty-stream '())

;;; 

; TESTS
(define (str1) (stream-cons 1 2))

(stream-car str1)
1

1 Answers

2
votes

Your line:

(define (str1) (stream-cons 1 2))

is defining a function called str1 and thus str1 is not a pair. It should read:

(define str1 (stream-cons 1 2))