Relocated more macros

This commit is contained in:
Justin Ethier 2015-08-19 21:48:04 -04:00
parent a15ac425c2
commit 0a1d257a17
2 changed files with 52 additions and 57 deletions

View file

@ -82,6 +82,9 @@
features features
and and
or or
begin
cond
when
quasiquote quasiquote
) )
(begin (begin
@ -106,6 +109,55 @@
(list (rename 'if) (rename 'tmp) (list (rename 'if) (rename 'tmp)
(rename 'tmp) (rename 'tmp)
(cons (rename 'or) (cddr expr))))))))) (cons (rename 'or) (cddr expr)))))))))
(define-syntax begin
(er-macro-transformer
(lambda (exp rename compare)
(define (singlet? l)
(and (list? l)
(= (length l) 1)))
(define (dummy-bind exps)
(cond
((singlet? exps) (car exps))
; JAE - should be fine until CPS phase
((pair? exps)
`((lambda ()
,@exps)))))
;((pair? exps) `(let (($_ ,(car exps)))
; ,(dummy-bind (cdr exps))))))
(dummy-bind (cdr exp)))))
(define-syntax cond
(er-macro-transformer
(lambda (expr rename compare)
(if (null? (cdr expr))
#f ;(if #f #f)
((lambda (cl)
(if (compare (rename 'else) (car cl))
(if (pair? (cddr expr))
(error "non-final else in cond" expr)
(cons (rename 'begin) (cdr cl)))
(if (if (null? (cdr cl)) #t (compare (rename '=>) (cadr cl)))
(list (list (rename 'lambda) (list (rename 'tmp))
(list (rename 'if) (rename 'tmp)
(if (null? (cdr cl))
(rename 'tmp)
(list (car (cddr cl)) (rename 'tmp)))
(cons (rename 'cond) (cddr expr))))
(car cl))
(list (rename 'if)
(car cl)
(cons (rename 'begin) (cdr cl))
(cons (rename 'cond) (cddr expr))))))
(cadr expr))))))
(define-syntax when
(er-macro-transformer
(lambda (exp rename compare)
(if (null? (cdr exp)) (error "empty when" exp))
(if (null? (cddr exp)) (error "no when body" exp))
`(if ,(cadr exp)
((lambda () ,@(cddr exp)))
#f))))
(define-syntax quasiquote (define-syntax quasiquote
(er-macro-transformer (er-macro-transformer
;; Based on the quasiquote macro from Chibi scheme ;; Based on the quasiquote macro from Chibi scheme

View file

@ -112,7 +112,6 @@
expand expand
let=>lambda let=>lambda
letrec=>lets+sets letrec=>lets+sets
begin=>let
isolate-globals isolate-globals
has-global? has-global?
global-vars global-vars
@ -139,7 +138,6 @@
(define (get-macros) *defined-macros*) (define (get-macros) *defined-macros*)
(define *defined-macros* (define *defined-macros*
(list (list
; (cons 'let (lambda (exp rename compare) (let=>lambda exp)))
(cons 'let (cons 'let
(lambda (expr rename compare) (lambda (expr rename compare)
(if (null? (cdr expr)) (error "empty let" expr)) (if (null? (cdr expr)) (error "empty let" expr))
@ -177,36 +175,7 @@
`(,(rename 'let) (,(caar (cdr expr))) `(,(rename 'let) (,(caar (cdr expr)))
(,(rename 'let*) ,(cdar (cdr expr)) ,@(cddr expr))) (,(rename 'let*) ,(cdar (cdr expr)) ,@(cddr expr)))
(error "bad let* syntax"))))) (error "bad let* syntax")))))
(cons 'begin (lambda (exp rename compare) (begin=>let exp)))
(cons 'letrec (lambda (exp rename compare) (letrec=>lets+sets exp))) (cons 'letrec (lambda (exp rename compare) (letrec=>lets+sets exp)))
(cons 'when (lambda (exp rename compare)
(if (null? (cdr exp)) (error "empty when" exp))
(if (null? (cddr exp)) (error "no when body" exp))
`(if ,(cadr exp)
((lambda () ,@(cddr exp)))
#f)))
(cons 'cond
(lambda (expr rename compare)
(if (null? (cdr expr))
#f ;(if #f #f)
((lambda (cl)
(if (compare (rename 'else) (car cl))
(if (pair? (cddr expr))
(error "non-final else in cond" expr)
(cons (rename 'begin) (cdr cl)))
(if (if (null? (cdr cl)) #t (compare (rename '=>) (cadr cl)))
(list (list (rename 'lambda) (list (rename 'tmp))
(list (rename 'if) (rename 'tmp)
(if (null? (cdr cl))
(rename 'tmp)
(list (car (cddr cl)) (rename 'tmp)))
(cons (rename 'cond) (cddr expr))))
(car cl))
(list (rename 'if)
(car cl)
(cons (rename 'begin) (cdr cl))
(cons (rename 'cond) (cddr expr))))))
(cadr expr)))))
(cons 'case (cons 'case
(lambda (expr rename compare) (lambda (expr rename compare)
(define (body exprs) (define (body exprs)
@ -1014,14 +983,6 @@
; TODO: eventually, merge below functions with above *defined-macros* defs and ; TODO: eventually, merge below functions with above *defined-macros* defs and
;; replace both with a lib of (define-syntax) constructs ;; replace both with a lib of (define-syntax) constructs
;; let=>lambda : let-exp -> app-exp
;(define (let=>lambda exp)
; (if (let? exp)
; (let ((vars (map car (let->bindings exp)))
; (args (map cadr (let->bindings exp))))
; `((lambda (,@vars) ,@(let->exp exp)) ,@args))
; exp))
; letrec=>lets+sets : letrec-exp -> exp ; letrec=>lets+sets : letrec-exp -> exp
(define (letrec=>lets+sets exp) (define (letrec=>lets+sets exp)
(if (letrec? exp) (if (letrec? exp)
@ -1043,24 +1004,6 @@
;; (map (lambda (x) (cons (rename 'define) x)) (cadr expr)))))) ;; (map (lambda (x) (cons (rename 'define) x)) (cadr expr))))))
;; ;;
; begin=>let : begin-exp -> let-exp
(define (begin=>let exp)
(define (singlet? l)
(and (list? l)
(= (length l) 1)))
(define (dummy-bind exps)
(cond
((singlet? exps) (car exps))
; JAE - should be fine until CPS phase
((pair? exps)
`((lambda ()
,@exps)))))
;((pair? exps) `(let (($_ ,(car exps)))
; ,(dummy-bind (cdr exps))))))
(dummy-bind (begin->exps exp)))
;; Top-level analysis ;; Top-level analysis