Finished 12.

This commit is contained in:
2026-03-01 14:15:07 -05:00
parent e241d55e63
commit ecfbf910cd
2 changed files with 74 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
#lang pl broken
+73
View File
@@ -1 +1,74 @@
#lang pl broken
(define (Z f)
((λ (x) (f (λ (v) ((x x) v))))
(λ (x) (f (λ (v) ((x x) v))))))
(rewrite (define/rec (f x ...) E) =>
(define f
(let ([g (Z (λ (f)
(λ (_) ; Ignore this arg.
(λ (x ...)
(let ([f (f #f)]) ; #f is bogus.
E)))) )])
(g #f)))) ; #f is bogus.
; ackermann : Nat Nat -> Nat
(define/rec (ackermann m n)
(cond [(zero? m) (+ n 1)]
[(zero? n) (ackermann (- m 1) 1)]
[else (ackermann (- m 1) (ackermann m (- n 1)))]))
(test (ackermann 3 3) => 61)
(rewrite (letfuns ([(f x) E] ...) B) =>
(let ([g (Z (λ (funs)
(λ (fname)
(match fname
['f (λ (x)
(let ([f (funs 'f)] ...)
E))]
...))))])
(let ([f (g 'f)] ...)
B)))
(test (letfuns ([(even? n) (if (= n 0) #t (odd? (- n 1)))]
[(odd? n) (if (= n 0) #f (even? (- n 1)))])
(even? 123)) => #f)
(rewrite (letfunss ([(f x ...) E] ...) B) =>
(let ([g (Z (λ (funs)
(λ (name)
(match name
['f (λ (x ...)
(let ([f (funs 'f)] ...)
E))]
...))))])
(let ([f (g 'f)] ...)
B)))
(define balanced?
(letfunss ([(balanced? l)
(and (not (null? l))
(symbol=? (first l) 'left)
(symbol=? (last l) 'right)
(check l 0))]
[(check l amount)
(cond [(null? l) (= amount 0)]
[(symbol=? (first l) 'left)
(check (rest l) (add1 amount))]
[(symbol=? (first l) 'right)
(and (> amount 0)
(check (rest l) (sub1 amount)))]
[else (check (rest l) amount)])]
[(last l)
(cond [(null? (rest l)) (first l)]
[else (last (rest l))])])
balanced?))
(test (balanced? '()) => #f)
(test (balanced? '(left right)) => #t)
(test (balanced? '(left left right right)) => #t)
(test (balanced? '(left right right)) => #f)
(test (balanced? '(left right right)) => #f)
(test (balanced? '(left fasdkfhaskdjhfkajshdfkajhsdkfjhaskdjfhasdhf right)) => #t)