init commit

This commit is contained in:
2025-11-19 10:40:52 -06:00
commit 8790144e6e
2 changed files with 556 additions and 0 deletions

38
denotational-lambda.scm Normal file
View File

@@ -0,0 +1,38 @@
(use-modules (ice-9 match)
(srfi srfi-64))
(define (meaning expr)
(match expr
[`(lambda (,var) ,expr)
(lambda (env)
(lambda (e)
((meaning expr) (rename env e var))))]
[(exp0 exp1)
(lambda (env)
(((meaning exp0) env) ((meaning exp1) env)))]
[var (lambda (env) (env var))]))
(define (rename env var e)
(let ([v (env var)])
(lambda (var)
(if (eq? e var)
v
(env var)))))
;; Okay this isn't really that useful
(define (echo-env)
(lambda (x) x))
(test-begin "echo-env")
(test-eq 'x ((meaning 'x) (echo-env)))
(test-eq 'y ((meaning '((lambda (x) x) y)) (echo-env)))
(test-end "echo-env")
(define (successor-env)
(lambda (x)
(cond
[(number? x) x]
[else (lambda (x) (+ x 1))])))
(test-begin "successor-env")
(test-eqv 1 ((meaning '(((lambda (f) (lambda (x) (f x))) succ) 0)) (successor-env)))
(test-eqv 2 ((meaning '(((lambda (f) (lambda (x) (f (f x)))) succ) 0)) (successor-env)))
(test-end "successor-env")