summaryrefslogtreecommitdiff
path: root/shared
diff options
context:
space:
mode:
authorMike Vink <mike1994vink@gmail.com>2023-07-06 22:31:56 +0200
committerMike Vink <mike1994vink@gmail.com>2023-07-06 22:31:56 +0200
commita8a8e239968d45cc2539b6a55f4dcde04f5543fd (patch)
tree1f727653bf2f9d6ac5101a19796da851c6f53546 /shared
parent872edd4013539f3dfe2535f95d7efdbb6ca5e797 (diff)
stuff
Diffstat (limited to 'shared')
-rw-r--r--shared/queue.rkt30
-rw-r--r--shared/sicp-stream.rkt60
2 files changed, 90 insertions, 0 deletions
diff --git a/shared/queue.rkt b/shared/queue.rkt
new file mode 100644
index 0000000..4777cce
--- /dev/null
+++ b/shared/queue.rkt
@@ -0,0 +1,30 @@
+#lang racket
+
+(require compatibility/mlist)
+;; queue methods
+(define (front-ptr q) (mcar q))
+(define (rear-ptr q) (mcdr q))
+(define (set-front-ptr! q v) (set-mcar! q v))
+(define (set-rear-ptr! q v) (set-mcdr! q v))
+(define (empty-queue? q) (null? (front-ptr q)))
+(define (make-queue) (mcons '() '()))
+(define (front-queue q)
+ (if (empty-queue? q)
+ (error "FRONT called on empty queue" q)
+ (mcar (front-ptr q))))
+(define (insert-queue! q item)
+ (let ((new-item (mlist item)))
+ (cond ((empty-queue? q)
+ (set-front-ptr! q new-item)
+ (set-rear-ptr! q new-item)
+ q)
+ (else
+ (set-mcdr! (rear-ptr q) new-item)
+ (set-rear-ptr! q new-item)
+ q))))
+(define (delete-queue! q)
+ (cond ((empty-queue? q)
+ (error "DELETE! called with an empty queue" q))
+ (else
+ (set-front-ptr! q (mcdr (front-ptr q)))
+ q)))
diff --git a/shared/sicp-stream.rkt b/shared/sicp-stream.rkt
new file mode 100644
index 0000000..e7a28d0
--- /dev/null
+++ b/shared/sicp-stream.rkt
@@ -0,0 +1,60 @@
+#lang racket
+(require racket/stream)
+(provide
+ stream-cons
+ stream-car
+ stream-cdr
+ the-empty-stream
+ stream-null?
+ display-line
+ show
+ display-stream
+ stream-ref
+ stream-for-each
+ stream-enumerate-interval
+ stream-map
+ stream-filter)
+
+;; (define (delay b) (lambda () b))
+;; (define (force f) (f))
+;; (define (cons-stream a b) (cons a (delay b)))
+;; (define (cons-stream a b) (stream-cons a b))
+;; streams in racket by default are not eager for the head of the cons
+(define (stream-car stream) (stream-first stream))
+(define (stream-cdr stream) (stream-rest stream))
+(define the-empty-stream (stream))
+(define (stream-null? stream) (stream-empty? stream))
+(define (display-line x) (newline) (display x))
+(define (show x) (display-line x) x)
+(define (display-stream s) (stream-for-each display-line s))
+
+(define (stream-ref s n)
+ (if (= n 0)
+ (stream-car s)
+ (stream-ref (stream-cdr s) (- n 1))))
+
+(define (stream-for-each proc s)
+ (if (stream-null? s)
+ 'done
+ (begin (proc (stream-car s))
+ (stream-for-each proc (stream-cdr s)))))
+
+(define (stream-enumerate-interval low high)
+ (if (> low high)
+ the-empty-stream
+ (stream-cons
+ low
+ (stream-enumerate-interval (+ low 1) high))))
+
+(define (stream-map proc . argstreams)
+ (if (stream-null? (car argstreams))
+ the-empty-stream
+ (stream-cons
+ (apply proc (map stream-car argstreams))
+ (apply stream-map
+ (cons proc (map stream-cdr argstreams))))))
+
+(define (stream-filter pred s)
+ (cond ((stream-null? s) the-empty-stream)
+ ((pred (stream-car s)) (stream-cons (stream-car s) (stream-filter pred (stream-cdr s))))
+ (else (stream-filter pred (stream-cdr s)))))