aboutsummaryrefslogtreecommitdiff
path: root/lib.rkt
diff options
context:
space:
mode:
authorJJ2024-06-24 04:14:04 +0000
committerJJ2024-06-24 04:14:04 +0000
commit28943cbc47c55066c72a95755bc3a4e8e9eb236a (patch)
treefc7ed043fe295cc0ce5bd4f18a3c3ef798753440 /lib.rkt
parent043ac7bd62b5f6114374a33c4bff17c6fb59837b (diff)
stlc-dll: major bugfixes
Diffstat (limited to 'lib.rkt')
-rw-r--r--lib.rkt27
1 files changed, 17 insertions, 10 deletions
diff --git a/lib.rkt b/lib.rkt
index 8e03922..72f93ad 100644
--- a/lib.rkt
+++ b/lib.rkt
@@ -46,11 +46,11 @@
;; removes typing annotations
(define (strip expr)
(match expr
- [`(,x : ,t) x]
- [`(type ,t1 ,t2 ,in) (strip in)] ; todo: do better
- [`(,e1 ,e2 ,e3 ,e4) `(,(strip e1) ,(strip e2) ,(strip e3) ,(strip e4))]
- [`(,e1 ,e2 ,e3) `(,(strip e1) ,(strip e2) ,(strip e3))]
- [`(,e1 ,e2) `(,(strip e1) ,(strip e2))]
+ [`(,x : ,t) (strip x)]
+ [`(type ,t1 ,t2 ,in) (strip in)]
+ [`(fold ,t ,e) `(fold ,(strip e))]
+ [`(unfold ,t ,e) `(unfold ,(strip e))]
+ [`(,e ...) `(,@(map strip e))]
[e e]))
;; (fmt Expr): String
@@ -86,8 +86,12 @@
[`(set ,e1 ,e2 ,in)
(desugar `(let (_ : Unit) (set ,e1 ,e2) ,in))]
+ [`(let (,id : (,a → ,k ,b)) (λ (,x : ,a) ,e) ,in)
+ (desugar `((λ (,id : (,a → ,k ,b)) ,in) (λ (,x : ,a) ,e)))]
[`(let (,id : (,a → ,k ,b)) (λ ,x ,e) ,in)
(desugar `((λ (,id : (,a → ,k ,b)) ,in) (λ (,x : ,a) ,e)))]
+ [`(let (,id : (,a → ,b)) (λ (,x : ,a) ,e) ,in)
+ (desugar `((λ (,id : (,a → ,b)) ,in) (λ (,x : ,a) ,e)))]
[`(let (,id : (,a → ,b)) (λ ,x ,e) ,in)
(desugar `((λ (,id : (,a → ,b)) ,in) (λ (,x : ,a) ,e)))]
[`(let ,x ,e ,in)
@@ -98,10 +102,7 @@
[`(letrec (,x : ,t) ,e ,in)
(desugar `(let (,x : ,t) (fix (λ (,x : ,t) ,e)) ,in))]
- [`(λ (,x : ,t) ,e) `(λ (,x : ,t) ,(desugar e))]
- [`(,e1 ,e2 ,e3 ,e4) `(,(desugar e1) ,(desugar e2) ,(desugar e3) ,(desugar e4))]
- [`(,e1 ,e2 ,e3) `(,(desugar e1) ,(desugar e2) ,(desugar e3))]
- [`(,e1 ,e2) `(,(desugar e1) ,(desugar e2))]
+ [`(,e ...) `(,@(map desugar e))]
[e e]))
(define (char-inc c) (integer->char (inc (char->integer c))))
@@ -144,9 +145,15 @@
[`(μ ,x ,t)
(let ([new (fresh (dict-values used))])
`(μ ,new ,(α-convert t (dict-set used x new))))]
- [`(,e ...) (map (λ (x) (α-convert x used)) e)]
+ [`(,e ...) `(,@(map (λ (x) (α-convert x used)) e))]
[v v]))
(check-equal? '(λ a (λ b (λ c (a (b c)))))
(α-convert '(λ a (λ b (λ c (a (b c)))))))
(check-equal? '(λ a (λ b (λ c (a (b c)))))
(α-convert '(λ c (λ a (λ b (c (a b)))))))
+
+(define (replace expr key value)
+ (match expr
+ [x #:when (equal? x key) value]
+ [`(,e ...) `(,@(map (λ (x) (replace x key value)) e))]
+ [v v]))