Add lazy lists from the book

This commit is contained in:
Oliver Payne 2023-09-01 23:15:30 +01:00
parent c5418454ed
commit f5ca407f3e
2 changed files with 45 additions and 0 deletions

41
mceval/lazy-list.rkt Normal file
View File

@ -0,0 +1,41 @@
;; Lisp code that can be evaluated by the lazy evaluator to implement
;; lazy lists
#lang sicp
(#%provide lazy-lists-program)
(define lazy-lists-program
'((define (cons x y)
(lambda (m) (m x y)))
(define (car z)
(z (lambda (p q) p)))
(define (cdr z)
(z (lambda (p q) q)))
(define (list-ref items n)
(if (= n 0) (car items)
(list-ref (cdr items)
(- n 1))))
(define (map proc items)
(if (null? items) '()
(cons (proc (car items))
(map proc (cdr items)))))
(define (scale-list items factor)
(map (lambda (x) (* x factor)) items))
(define (add-lists list1 list2)
(cond ((null? list1) (car list2))
((null? list2) (car list1))
(else
(cons (+ (car list1) (car list2))
(add-lists (cdr list1)
(cdr list2))))))
(define ones (cons 1 ones))
(define integers (cons 1 (add-lists ones integers)))))

View File

@ -10,6 +10,7 @@
(#%require "environment.rkt")
(#%require "common.rkt")
(#%require "special-forms.rkt")
(#%require "lazy-list.rkt")
(#%provide lazy-driver-loop
lazy-eval-program)
@ -83,6 +84,8 @@
(define (lazy-driver-loop)
(define env (setup-environment))
;; Read in code to implement lazy lists
(eval-program lazy-lists-program actual-value user-print env)
(define (driver-loop)
(prompt-for-input input-prompt)
(let ((input (read)))
@ -94,6 +97,7 @@
(define (lazy-eval-program program)
(define env (setup-environment))
(eval-program lazy-lists-program actual-value user-print env)
(eval-program program actual-value user-print env))
;;; Representing thunks