Created
February 8, 2017 06:46
-
-
Save lazear/b77ab85c8aa064341077d90ef0e4d7a4 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(define (deep-map func list) | |
"Recursively map function onto sublists" | |
(map | |
(lambda (x) | |
(if (pair? x) | |
(deep-map func x) | |
(func x))) list)) | |
(define (free-variable-list func) | |
(let ((body (caddr func)) (args (cadr func))) | |
(print (deep-map (lambda (x) | |
(if (not (member x args)) x)) | |
body)))) | |
(define (list-after l tag) | |
(call/cc | |
(lambda (ret) | |
(map (lambda (x) | |
(if (pair? x) | |
(if (eq? (car x) tag) | |
(ret x)))) l)))) | |
(define (let-transform expr) | |
(call/cc | |
(lambda (ret) | |
(let ((let-statement (list-after expr 'let))) | |
(if (null? let-statement) | |
(ret #f) | |
(let ((args '()) (vals '())) | |
(define (trans params) | |
(if (null? params) | |
(ret (cons `(lambda ,args ,(caddr let-statement)) vals)) | |
(begin | |
(set! args (cons (caar params) args)) | |
(set! vals (cons (cadar params) vals)) | |
(trans (cdr params))))) | |
(trans (cadr let-statement)))))))) | |
(define l '(lambda (x y z) | |
(let ((m 10) (q 5)) | |
(set! m (cons x y)) | |
(cons m y)))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment