75 lines
2.5 KiB
Racket
75 lines
2.5 KiB
Racket
#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)
|