;;; $Id: subst-mod.scm,v 1.3 2006/01/05 22:24:09 leavens Exp $ ;; Grammar: ;; ::= "symbol (symbol)" ;; | "s-list (s-list)" ;; ::= ( {}* ) (module subst-mod (lib "typedscm.ss" "typedscm") (provide subst subst-sym-exp) (require (lib "sym-exp-mod.scm" "lib342")) ;; Examples: ;; (subst 'y 'x (parse-s-list '())) ==> () ;; (subst 'y 'x (parse-s-list '(x y () (x)))) ==> (y y () (y)) ;; (subst 'y 'x (parse-s-list '(y () (x)))) ==> (y () (y)) (deftype subst (-> (symbol symbol (list-of sym-exp)) (list-of sym-exp))) (define subst (lambda (new old slist) (if (null? slist) slist (cons (subst-sym-exp new old (car slist)) (subst new old (cdr slist)))))) ;; Examples: ;; (subst-sym-exp 'x 'a (parse-sym-exp 'a)) ==> x ;; (subst-sym-exp 'x 'a (parse-sym-exp 'b)) ==> b ;; (subst-sym-exp 'x 'a (parse-sym-exp '(x y (x)))) ;; ==> (x y (x)) ;; (subst-sym-exp 'x 'a (parse-sym-exp '(y (x)))) ;; ==> (y (x)) (deftype subst-sym-exp (-> (symbol symbol sym-exp) sym-exp)) (define subst-sym-exp (lambda (new old symexp) (if (sym-exp-symbol? symexp) (if (eq? old (sym-exp->symbol symexp)) (symbol new) symexp) (s-list (subst new old (sym-exp->s-list symexp)))))) ) ;; end module