aboutsummaryrefslogtreecommitdiff
path: root/hw06/hw06_alpha.scm
diff options
context:
space:
mode:
Diffstat (limited to 'hw06/hw06_alpha.scm')
-rw-r--r--hw06/hw06_alpha.scm52
1 files changed, 52 insertions, 0 deletions
diff --git a/hw06/hw06_alpha.scm b/hw06/hw06_alpha.scm
new file mode 100644
index 0000000..1a6cb1b
--- /dev/null
+++ b/hw06/hw06_alpha.scm
@@ -0,0 +1,52 @@
+#lang eopl
+
+; Ben Burwell
+; Dr. Kussmaul
+; CSI-310 :: Programming Languages
+; Homework 6: Alpha conversions
+
+;; ========== PROCEDURE ==========
+;; NAME: alpha-conv
+;; DESC: returns the alpha conversion of an expression if
+;; it exists. If there is no alpha conversion, the
+;; expression itself is returned.
+(define alpha-conv
+ (lambda (from to exp)
+ (if
+ (list? exp)
+ (if
+ (equal? (length exp) 3)
+ (if
+ (and
+ (equal? (car exp) 'lambda)
+ (list? (cadr exp))
+ (equal? (length (cadr exp)) 1)
+ (list? (caddr exp))
+ )
+ (list 'lambda (list to) (list-repl from to (caddr exp)))
+ exp)
+ exp)
+ exp)))
+
+;; ========== PROCEDURE ==========
+;; NAME: list-repl
+;; DESC: a helper function for the alpha conversion
+;; replaces all occurrences of from with to in
+;; exp unless there is a nested lambda function,
+;; in which case it remains intact.
+(define list-repl
+ (lambda (from to exp)
+ (cond
+ [ (equal? (length exp) 0) '() ]
+ [ (equal? (car exp) from) (cons to (list-repl from to (cdr exp))) ]
+ [ (and (list? (car exp)) (equal? (caar exp) 'lambda)) (cons (car exp) (list-repl from to (cdr exp))) ]
+ [ (list? (car exp)) (cons (list-repl from to (car exp)) (list-repl from to (cdr exp))) ]
+ [ else (cons (car exp) (list-repl from to (cdr exp))) ]
+ )))
+
+;; ========== TEST CODE ==========
+(alpha-conv 'x 'y '(x z))
+(alpha-conv 'x 'y '((lambda ( x ) (+ x 5)) 2))
+(alpha-conv 'x 'y '(lambda ( x ) (x z x)))
+(alpha-conv 'x 'y '(lambda ( y ) (y z y)))
+(alpha-conv 'x 'y '(lambda ( x ) (+ x ((lambda (x) (* 2 x)) 7)))) \ No newline at end of file