init commit
This commit is contained in:
38
denotational-lambda.scm
Normal file
38
denotational-lambda.scm
Normal 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")
|
||||
Reference in New Issue
Block a user