-
-
Save davidrupp/1861116 to your computer and use it in GitHub Desktop.
traditional lisp macros
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
;; outlet code for implementing traditional macro expansion | |
;; macros | |
(define (expand form) | |
(cond | |
((variable? form) form) | |
((literal? form) form) | |
((macro? (car form)) | |
(expand ((macro-function (car form)) form))) | |
((eq? (car form) 'quote) | |
form) | |
((eq? (car form) 'lambda) | |
`(lambda ,(car (cdr form)) | |
,@(map expand (cdr (cdr form))))) | |
(else (map expand form)))) | |
(define _macros_ {}) | |
(define (macro-function name) | |
(ref _macros_ (symbol->string name))) | |
(define (install-macro name func) | |
(put! _macros_ (symbol->string name) func)) | |
(define (macro? name) | |
(not (eq? (ref _macros_ (symbol->string name)) | |
undefined))) | |
;; compiler | |
(define (read src) | |
(vector-to-list | |
(reader grammar src '[begin]))) | |
(install-macro 'define (lambda (form) | |
`(define* ,(car (cdr form)) | |
,@(cdr (cdr form))))) | |
(let ((src (fs.readFileSync "example.ol" "utf-8"))) | |
(pretty (expand (read src)))) | |
;; (define (foo x y z) | |
;; (+ x y z)) | |
;; | |
;; expand to: | |
;; | |
;; (define* (foo x y z) | |
;; (+ x y z)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment