dawning7670 / CEK-interp

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

CEK-interp

A CEK-Style racket interpreter

This project is inspired by Matt's article(Matt: Writing CEK-style interpreters (or semantics) in Haskell)

Implemented

  • define
  • lambda
  • begin
  • if
  • quote
  • set!
  • call/cc

Usage

; variable
> (interp '(begin (define a 1) a))
1

; function
> (interp '(begin
             (define fac (lambda (n)
                           (if (= n 1)
                               1
                               (* n (fac (- n 1))))))
             (fac 5)))
120

; call/cc
> (interp '(begin
             (define (for-each f lst)
               (if (null? lst)
                   (void)
                   (begin
                     (f (car lst))
                     (for-each f (cdr lst)))))

             (define (generate-one-element-at-a-time lst)
               (define (control-state return)
                 (for-each
                  (lambda (element)
                    (set! return (call-with-current-continuation
                                  (lambda (resume-here)
                                    (set! control-state resume-here)
                                    (return element)))))
                  lst)
                 (return 'you-fell-off-the-end))

               (define (generator)
                 (call-with-current-continuation control-state))

               generator)

             (define generate-digit
               (generate-one-element-at-a-time '(1 2 3)))

             (list (generate-digit) (generate-digit) (generate-digit) (generate-digit))))
(1 2 3 you-fell-off-the-end)

About


Languages

Language:Racket 100.0%