Skip to content

Instantly share code, notes, and snippets.

@wilbowma
Created January 22, 2022 03:18
Show Gist options
  • Save wilbowma/02dd3f29f37b53c42b6d3fc93d4891fd to your computer and use it in GitHub Desktop.
Save wilbowma/02dd3f29f37b53c42b6d3fc93d4891fd to your computer and use it in GitHub Desktop.
#lang s-exp "interp.rkt"
(define f (lambda (x) #t))
(f #f)
#lang racket
(define (interp x)
(define (interp-te env e)
(match e
[`(define ,x ,e)
(values (dict-set env x (interp-e env e)) (void))]
[_
(values env (interp-e env e))]))
(define (interp-e env e)
(match e
[`(lambda (,x) ,e)
(lambda (y) (interp-e (dict-set env x y) e))]
[`(,e1 ,e2)
((interp-e env e1) (interp-e env e2))]
[`(if ,e ,e1 ,e2)
(if (interp-e env e)
(interp-e env e1)
(interp-e env e2))]
[#t #t]
[#f #f]
[(? symbol?)
(dict-ref env e)]))
(match x
[`(module ,es ...)
(define-values (_ vs)
(for/fold ([env '()]
[vs '()])
([e es])
(let-values ([(env new-v) (interp-te env e)])
(values env (cons new-v vs)))))
(for-each displayln (filter (compose not void?) vs))]))
(provide
(rename-out [module-begin #%module-begin])
#%top-interaction)
(define-syntax (module-begin stx)
(syntax-case stx ()
[(_ e ...)
#`(#%module-begin
(interp `(module #,@(syntax->datum #'(e ...)))))]))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment