docs: add example scheme programs
This commit is contained in:
1 parent
5e1aec0f78
commit
5649b7bad8
6 files changed
+151
No files matched your search
@@ -0,0 +1,30 @@
|
|||||||
|
; call/cc used for early exit from a loop.
|
||||||
|
(define (list-product items)
|
||||||
|
(call/cc
|
||||||
|
(lambda (break)
|
||||||
|
(let loop ((xs items) (acc 1))
|
||||||
|
(cond ((null? xs) acc)
|
||||||
|
((= (car xs) 0) (break 0))
|
||||||
|
(else (loop (cdr xs) (* acc (car xs)))))))))
|
||||||
|
|
||||||
|
(display "product 1..5 = ")
|
||||||
|
(display (list-product '(1 2 3 4 5)))
|
||||||
|
(newline)
|
||||||
|
(display "product with a zero = ")
|
||||||
|
(display (list-product '(1 2 0 4 5)))
|
||||||
|
(newline)
|
||||||
|
|
||||||
|
; call/cc with re-entry: a captured continuation is invoked repeatedly
|
||||||
|
; to build a loop that sums 1..5 within a single expression.
|
||||||
|
(display "reentry sum 1..5 = ")
|
||||||
|
(display
|
||||||
|
(let ((sum 0)
|
||||||
|
(i 0)
|
||||||
|
(k #f))
|
||||||
|
(call/cc (lambda (c) (set! k c)))
|
||||||
|
(set! i (+ i 1))
|
||||||
|
(set! sum (+ sum i))
|
||||||
|
(if (< i 5)
|
||||||
|
(k #f)
|
||||||
|
sum)))
|
||||||
|
(newline)
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
; Tail-recursive factorial using a named let accumulator.
|
||||||
|
(define (factorial n)
|
||||||
|
(let loop ((i n) (acc 1))
|
||||||
|
(if (= i 0)
|
||||||
|
acc
|
||||||
|
(loop (- i 1) (* acc i)))))
|
||||||
|
|
||||||
|
(display "10! = ")
|
||||||
|
(display (factorial 10))
|
||||||
|
(newline)
|
||||||
|
(display "20! = ")
|
||||||
|
(display (factorial 20))
|
||||||
|
(newline)
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
; Naive recursive Fibonacci.
|
||||||
|
(define (fib n)
|
||||||
|
(if (< n 2)
|
||||||
|
n
|
||||||
|
(+ (fib (- n 1)) (fib (- n 2)))))
|
||||||
|
|
||||||
|
(display "fib 10 = ")
|
||||||
|
(display (fib 10))
|
||||||
|
(newline)
|
||||||
|
(display "fib 20 = ")
|
||||||
|
(display (fib 20))
|
||||||
|
(newline)
|
||||||
|
(display "fib 25 = ")
|
||||||
|
(display (fib 25))
|
||||||
|
(newline)
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
; User-defined macros via define-syntax / syntax-rules.
|
||||||
|
(define-syntax swap!
|
||||||
|
(syntax-rules ()
|
||||||
|
((_ a b)
|
||||||
|
(let ((tmp a))
|
||||||
|
(set! a b)
|
||||||
|
(set! b tmp)))))
|
||||||
|
|
||||||
|
(define x 1)
|
||||||
|
(define y 2)
|
||||||
|
(swap! x y)
|
||||||
|
(display "swap x y -> ")
|
||||||
|
(display (list x y))
|
||||||
|
(newline)
|
||||||
|
|
||||||
|
; Hygiene: a user variable literally named tmp must not be captured
|
||||||
|
; by the tmp introduced inside the macro template.
|
||||||
|
(define tmp 10)
|
||||||
|
(define other 20)
|
||||||
|
(swap! tmp other)
|
||||||
|
(display "swap tmp other -> ")
|
||||||
|
(display (list tmp other))
|
||||||
|
(newline)
|
||||||
|
|
||||||
|
; Ellipsis patterns.
|
||||||
|
(define-syntax my-list
|
||||||
|
(syntax-rules ()
|
||||||
|
((_ e ...) (list e ...))))
|
||||||
|
(display "my-list -> ")
|
||||||
|
(display (my-list 1 2 3 4 5))
|
||||||
|
(newline)
|
||||||
|
|
||||||
|
; Recursive macro.
|
||||||
|
(define-syntax my-or
|
||||||
|
(syntax-rules ()
|
||||||
|
((_) #f)
|
||||||
|
((_ e) e)
|
||||||
|
((_ e rest ...) (let ((t e)) (if t t (my-or rest ...))))))
|
||||||
|
(display "my-or -> ")
|
||||||
|
(display (my-or #f #f 7 8))
|
||||||
|
(newline)
|
||||||
|
|
||||||
|
; when / unless come from the prelude.
|
||||||
|
(when (> 5 3)
|
||||||
|
(display "when fired")
|
||||||
|
(newline))
|
||||||
|
(unless (> 3 5)
|
||||||
|
(display "unless fired")
|
||||||
|
(newline))
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
; Higher-order list operations.
|
||||||
|
(display "squares: ")
|
||||||
|
(display (map (lambda (x) (* x x)) '(1 2 3 4 5)))
|
||||||
|
(newline)
|
||||||
|
|
||||||
|
(display "odds: ")
|
||||||
|
(display (filter odd? '(1 2 3 4 5 6 7 8)))
|
||||||
|
(newline)
|
||||||
|
|
||||||
|
(display "sum via fold: ")
|
||||||
|
(display (fold-left + 0 '(1 2 3 4 5 6 7 8 9 10)))
|
||||||
|
(newline)
|
||||||
|
|
||||||
|
(display "zip-add: ")
|
||||||
|
(display (map + '(1 2 3) '(10 20 30)))
|
||||||
|
(newline)
|
||||||
|
|
||||||
|
(display "for-each: ")
|
||||||
|
(for-each display '(a b c d))
|
||||||
|
(newline)
|
||||||
|
|
||||||
|
(display "append+reverse: ")
|
||||||
|
(display (reverse (append '(1 2) '(3 4) '(5 6))))
|
||||||
|
(newline)
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
; Deep tail recursion: counting to a large number must not overflow the stack.
|
||||||
|
(define (count-up n)
|
||||||
|
(let loop ((i 0))
|
||||||
|
(if (= i n)
|
||||||
|
i
|
||||||
|
(loop (+ i 1)))))
|
||||||
|
|
||||||
|
(display "counted to ")
|
||||||
|
(display (count-up 1000000))
|
||||||
|
(newline)
|
||||||
|
|
||||||
|
; Mutual tail recursion should also stay in constant stack space.
|
||||||
|
(define (even-loop n)
|
||||||
|
(if (= n 0) #t (odd-loop (- n 1))))
|
||||||
|
(define (odd-loop n)
|
||||||
|
(if (= n 0) #f (even-loop (- n 1))))
|
||||||
|
|
||||||
|
(display "even? 1000000 -> ")
|
||||||
|
(display (even-loop 1000000))
|
||||||
|
(newline)
|
||||||
Reference in new issue
Block a user