;; ------------------------------------------------------------------------ ;; | FILE : let-to-app02-little.rkt | ;; | AUTHOR : Eugene Wallingford | ;; | CREATION DATE : 2024/03/19 | ;; | DESCRIPTION : demonstrates let as a syntaction abstraction | ;; | and how the abstraction simplifies processing | ;; ------------------------------------------------------------------------ #lang racket (require "syntax-procs.rkt") (provide preprocess) ;; -------------------------------------------------------------------------- ;; 1. Add let to our little language. ;; -------------------------------------------------------------------------- ;; This code works with the following grammar: ;; ;; ::= ;; | ( lambda ( ) ) ;; | ( ) ;; | ( let ( ) ) <--- NEW FEATURE ;; -------------------------------------------------------------------------- ;; 2. Create syntax procedures for let expressions ;; -------------------------------------------------------------------------- ;; see "syntax-procs.rkt" ;; -------------------------------------------------------------------------- ;; 3. Translate a let expression into a lambda application ;; -------------------------------------------------------------------------- ;; This function works only for a "one level" let expression. (define (let->app let-exp) (let ((var (let->var let-exp)) (val (let->val let-exp)) (body (let->body let-exp))) (make-app (make-lambda var body) val))) ;; This function supports nested expressions. (define (preprocess exp) (cond ; -------------------------------------------- abstraction ( (let? exp) (let ((var (let->var exp)) (val (let->val exp)) (body (let->body exp))) (make-app (make-lambda var (preprocess body)) (preprocess val)) ) ) ; ------------------------------------------ core features ( (varref? exp) (make-varref exp) ) ( (lambda? exp) (make-lambda (lambda->param exp) (preprocess (lambda->body exp))) ) ( (app? exp) (make-app (preprocess (app->proc exp)) (preprocess (app->arg exp))) ) ; -------------------------------------------------- oops! ( else (error 'preprocess "invalid expression ~a" exp) ))) ;; -------------------------------------------------------------------------- ;; 4. occurs-bound? and occurs-free? don't know about let. ;; Will they still work? ;; -------------------------------------------------------------------------- ;; see "using-let-exps.rkt" ;; --------------------------------------------------------------------------