Files
beluga/lisp-interpreter/tests/code/sicp.scm
T
Arthur Barraux d8fc7d2d67
Meson Build and Deploy / build (push) Failing after 29s
adding lisp-interpreter
2025-09-24 10:58:09 +02:00

159 lines
3.6 KiB
Scheme

; A collection of SICP excercises
; these are all my solutions from reading
; the book
; 1.01 - basic expressions
(assert (= (+ (* 2 4) (- 4 6)) 6))
(define a 3)
(define b (+ a 1))
(assert (= (+ a b (* a b)) 19))
(assert (= (if (and (> b a) (< b (* a b)))
b
a) 4))
(assert (= (cond ((= a 4) 6)
((= b 4) (+ 6 7 a))
(else 25)) 16))
(assert (= (+ 2 (if (> b a) b a )) 6))
(assert (= (* (cond ((> a b) a)
((< a b) b)
(else -1))
(+ a 1)) 16))
; 1.03 - largest squares
(define (sqr x) (* x x))
(define (largest-squares x y z)
(cond ((and (< z x) (< z y)) (+ (sqr x) (sqr y)))
((and (< y x) (> y z)) (+ (sqr x) (sqr z)))
(else (+ (sqr y) (sqr z)))
))
(assert (= (largest-squares 3 4 5) (+ 25 16)))
(assert (= (largest-squares 3 5 4) (+ 25 16)))
; 1.14 change counter
(define (count-change amount) (cc amount 5))
(define (cc amount kinds-of-coins)
(cond ((= amount 0) 1)
((or (< amount 0) (= kinds-of-coins 0)) 0)
(else (+ (cc amount
(- kinds-of-coins 1))
(cc (- amount
(first-denomination kinds-of-coins))
kinds-of-coins)))))
(define (first-denomination kinds-of-coins)
(cond ((= kinds-of-coins 1) 1)
((= kinds-of-coins 2) 5)
((= kinds-of-coins 3) 10)
((= kinds-of-coins 4) 25)
((= kinds-of-coins 5) 50)))
(display "counting change: ")
(display (count-change 75))
(newline)
; 1.16 - fast powers
(define (exp-fast b n) (exp-iter b n 1))
(define (exp-iter b n product)
(cond ((= n 0) product)
; b^n = (b^2) n/2
((even? n) (exp-iter (* b b) (/ n 2) product))
; b^n = b * b^n-1
(else (exp-iter b (- n 1) (* product b)))))
(assert (= (exp-fast 5 4) 625))
(assert (= (exp-fast 2 8) 256))
; 1.17 - fast multiply
(define (double a) (+ a a))
(define (halve a) (/ a 2))
(define (fast-mul a b) (fast-mul-iter a b 0))
(define (fast-mul-iter a b sum)
(cond ((= b 0) sum)
((even? b) (fast-mul-iter (double a) (halve b) sum))
(else (fast-mul-iter a (- b 1) (+ sum a)))))
(assert (= (fast-mul 3 4) 12))
(assert (= (fast-mul 100 10) 1000))
; 1.19 fibonacci
(define (fib-helper n a b p q)
(cond
((= n 0) b)
((even? n) (fib-helper (/ n 2)
a
b
(+ (* p p) (* q q))
(+ (* 2 q p) (* q q ))
))
(else
(fib-helper
(- n 1)
(+ (* b q) (* a q) (* a p))
(+ (* b p) (* a q))
p
q))))
(define (fib n)
(fib-helper n 1 0 0 1))
(assert (= (fib 5) 5))
(assert (= (fib 7) 13))
(assert (= (fib 8) 21))
; 2.21 - square list
(define (square-list items)
(if (null? items)
items
(cons (* (car items) (car items)) (square-list (cdr items)))))
(define (square-list2 items)
(map (lambda (x) (* x x)) items))
(display (square-list (list 1 2 3 4)))
(newline)
(display (square-list2 (list 4 5 6 7)))
; bank accounts
(define (make-account val)
(lambda (action)
(if (eq? action 'deposit)
(lambda (n) (set! val (+ val n)))
(lambda (n) (set! val (- val n))))))
(define justin (make-account 100))
(define ryan (make-account 200))
((justin 'deposit) 20)
((ryan 'withdraw) 20)
(gc-flip)
(assert (= ((justin 'withdraw) 0) 120))
(assert (= ((ryan 'deposity) 0) 180))
; and or expansion
(let ((a 1))
(if (and (= a 0) (garbage here))
(assert 0)
'pass)
(if (or (= a 1) (garbage here))
'pass
(assert 0)))