;;; $Id: lambda-1-quote-exp-examples.scm,v 1.3 2006/01/05 22:24:09 leavens Exp $ ;;; Examples in the language lambda-1-quote-exp (see lambda-1-quote-exp.scm). (module lambda-1-quote-exp-examples (lib "typedscm.ss" "typedscm") (provide count-var-exps all-var-exps subst-var-exps) (require (lib "lambda-1-quote-exp.scm" "lib342")) (deftype count-var-exps (-> (expression) number)) (define count-var-exps (lambda (exp) ;; ENSURES: result is the number of var-exps in exp (cond ((var-exp? exp) 1) ((quote-exp? exp) 0) ((lambda-exp? exp) (count-var-exps (lambda-exp->body exp))) (else (+ (count-var-exps (app-exp->rator exp)) (count-var-exps (app-exp->rand exp))))))) (deftype all-var-exps (-> (expression) (list-of symbol))) (define all-var-exps (lambda (exp) ;; ENSURES: result is a list of all the symbols in var-exps in exp ;; (this list may contain duplicate occurrences of symbols). (cond ((var-exp? exp) (list (var-exp->id exp))) ((quote-exp? exp) '()) ((lambda-exp? exp) (all-var-exps (lambda-exp->body exp))) ;; Note: in class we did all-var-exps so it returned a set, ;; so we used set-union instead of append. (else (append (all-var-exps (app-exp->rator exp)) (all-var-exps (app-exp->rand exp))))))) (deftype subst-var-exps (-> (symbol symbol expression) expression)) (define subst-var-exps (lambda (new old exp) ;; ENSURES: result is the same expression as exp, but with all var-exps ;; that are the same as old replaced by new. (cond ((var-exp? exp) (if (eq? old (var-exp->id exp)) (var-exp new) exp)) ; equal & slower: (var-exp (var-exp->id exp)) ((quote-exp? exp) exp) ; equal & slower: (quote-exp (quote->symbol exp)) ((lambda-exp? exp) (lambda-exp (lambda-exp->id exp) (subst-var-exps new old (lambda-exp->body exp)))) (else (app-exp (subst-var-exps new old (app-exp->rator exp)) (subst-var-exps new old (app-exp->rand exp))))))) ) ;; end module