Skip to content

Commit ef2ef7a

Browse files
committed
c3 50 stream-map update
1 parent 02bc144 commit ef2ef7a

File tree

3 files changed

+56
-9
lines changed

3 files changed

+56
-9
lines changed

src/c3_50.scm

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
(import (rnrs)
2+
(stream)
3+
(utils))
4+
5+
6+
(stream-display (stream-map square (list-stream 1 2 3)))
7+
8+
(stream-display (stream-map + (list-stream 1 2 3) (list-stream 2 3 4)))

src/lib/stream.scm

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,41 @@
11
(library
22
(stream)
33
(export cons-stream
4+
list-stream
45
stream-car
56
stream-cdr
67
the-empty-stream
78
stream-map
89
stream-filter
9-
stream-enumerate-interval)
10+
stream-enumerate-interval
11+
stream-display)
1012

11-
(import (rnrs base))
13+
(import (rnrs)
14+
(utils))
15+
16+
(define (memo-proc proc)
17+
(let ((already-run #f) (result '()))
18+
(lambda ()
19+
(if (not already-run)
20+
(begin (set! result (proc))
21+
(set! already-run #t)
22+
result)
23+
result))))
24+
25+
(define (force delayed-object)
26+
(delayed-object))
1227

1328
(define-syntax cons-stream
1429
(syntax-rules ()
15-
((cons-stream a b)
16-
(cons a (lambda () b)))))
30+
((cons-stream a b)
31+
(cons a (memo-proc (lambda () b))))))
32+
33+
(define-syntax list-stream
34+
(syntax-rules ()
35+
[(_) the-empty-stream]
36+
[(_ a b ...)
37+
(cons-stream a
38+
(list-stream b ...))]))
1739

1840
(define (stream-car stream) (car stream))
1941

@@ -24,11 +46,19 @@
2446
(define (stream-null? s)
2547
(null? s))
2648

27-
(define (stream-map proc s)
28-
(if (stream-null? s)
49+
; (define (stream-map proc s)
50+
;(if (stream-null? s)
51+
;the-empty-stream
52+
;(cons-stream (proc (stream-car s))
53+
;(stream-map proc (stream-cdr s)))))
54+
55+
56+
; (stream-map proc stream stream ...)
57+
(define (stream-map proc . stream-args)
58+
(if (stream-null? (car stream-args))
2959
the-empty-stream
30-
(cons-stream (proc (stream-car s))
31-
(stream-map proc (stream-cdr s)))))
60+
(cons-stream (apply proc (map stream-car stream-args))
61+
(apply stream-map (cons proc (map stream-cdr stream-args))))))
3262

3363
(define (stream-filter proc s)
3464
(cond ((stream-null? s) the-empty-stream)
@@ -51,4 +81,10 @@
5181
(begin
5282
(proc (stream-car s))
5383
(stream-for-each proc (stream-cdr s)))))
84+
85+
(define (stream-display s)
86+
(if (not (stream-null? s))
87+
(begin
88+
(println (stream-car s))
89+
(stream-display (stream-cdr s)))))
5490
)

src/lib/utils.scm

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
range
99
random-in-range
1010
sleepfor
11-
divides?)
11+
divides?
12+
println)
1213
(import (chezscheme))
1314
(define (set-cadr! lst v)
1415
(set-car! (cdr lst) v))
@@ -43,4 +44,6 @@
4344
(define (divides? a b)
4445
(= (remainder b a) 0))
4546

47+
(define (println v)
48+
(display v)(newline))
4649
)

0 commit comments

Comments
 (0)