mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-12 23:37:38 +02:00
Relocated let/let*
This commit is contained in:
parent
4c34c318c3
commit
c694e244c6
2 changed files with 41 additions and 37 deletions
|
@ -84,6 +84,8 @@
|
|||
every
|
||||
and
|
||||
or
|
||||
let
|
||||
let*
|
||||
begin
|
||||
cond
|
||||
when
|
||||
|
@ -111,6 +113,45 @@
|
|||
(list (rename 'if) (rename 'tmp)
|
||||
(rename 'tmp)
|
||||
(cons (rename 'or) (cddr expr)))))))))
|
||||
(define-syntax let
|
||||
(er-macro-transformer
|
||||
(lambda (expr rename compare)
|
||||
(if (null? (cdr expr)) (error "empty let" expr))
|
||||
(if (null? (cddr expr)) (error "no let body" expr))
|
||||
((lambda (bindings)
|
||||
(if (list? bindings) #f (error "bad let bindings"))
|
||||
(if (every (lambda (x)
|
||||
(if (pair? x) (if (pair? (cdr x)) (null? (cddr x)) #f) #f))
|
||||
bindings)
|
||||
((lambda (vars vals)
|
||||
(if (symbol? (cadr expr))
|
||||
`((,(rename 'lambda) ,vars
|
||||
(,(rename 'letrec) ((,(cadr expr)
|
||||
(,(rename 'lambda) ,vars
|
||||
,@(cdr (cddr expr)))))
|
||||
(,(cadr expr) ,@vars)))
|
||||
,@vals)
|
||||
`((,(rename 'lambda) ,vars ,@(cddr expr)) ,@vals)))
|
||||
(map car bindings)
|
||||
(map cadr bindings))
|
||||
(error "bad let syntax" expr)))
|
||||
(if (symbol? (cadr expr)) (car (cddr expr)) (cadr expr))))))
|
||||
(define-syntax let*
|
||||
(er-macro-transformer
|
||||
(lambda (expr rename compare)
|
||||
(if (null? (cdr expr)) (error "empty let*" expr))
|
||||
(if (null? (cddr expr)) (error "no let* body" expr))
|
||||
(if (null? (cadr expr))
|
||||
`(,(rename 'let) () ,@(cddr expr))
|
||||
(if (if (list? (cadr expr))
|
||||
(every
|
||||
(lambda (x)
|
||||
(if (pair? x) (if (pair? (cdr x)) (null? (cddr x)) #f) #f))
|
||||
(cadr expr))
|
||||
#f)
|
||||
`(,(rename 'let) (,(caar (cdr expr)))
|
||||
(,(rename 'let*) ,(cdar (cdr expr)) ,@(cddr expr)))
|
||||
(error "bad let* syntax"))))))
|
||||
(define-syntax begin
|
||||
(er-macro-transformer
|
||||
(lambda (exp rename compare)
|
||||
|
|
|
@ -138,43 +138,6 @@
|
|||
(define (get-macros) *defined-macros*)
|
||||
(define *defined-macros*
|
||||
(list
|
||||
(cons 'let
|
||||
(lambda (expr rename compare)
|
||||
(if (null? (cdr expr)) (error "empty let" expr))
|
||||
(if (null? (cddr expr)) (error "no let body" expr))
|
||||
((lambda (bindings)
|
||||
(if (list? bindings) #f (error "bad let bindings"))
|
||||
(if (every (lambda (x)
|
||||
(if (pair? x) (if (pair? (cdr x)) (null? (cddr x)) #f) #f))
|
||||
bindings)
|
||||
((lambda (vars vals)
|
||||
(if (symbol? (cadr expr))
|
||||
`((,(rename 'lambda) ,vars
|
||||
(,(rename 'letrec) ((,(cadr expr)
|
||||
(,(rename 'lambda) ,vars
|
||||
,@(cdr (cddr expr)))))
|
||||
(,(cadr expr) ,@vars)))
|
||||
,@vals)
|
||||
`((,(rename 'lambda) ,vars ,@(cddr expr)) ,@vals)))
|
||||
(map car bindings)
|
||||
(map cadr bindings))
|
||||
(error "bad let syntax" expr)))
|
||||
(if (symbol? (cadr expr)) (car (cddr expr)) (cadr expr)))))
|
||||
(cons 'let*
|
||||
(lambda (expr rename compare)
|
||||
(if (null? (cdr expr)) (error "empty let*" expr))
|
||||
(if (null? (cddr expr)) (error "no let* body" expr))
|
||||
(if (null? (cadr expr))
|
||||
`(,(rename 'let) () ,@(cddr expr))
|
||||
(if (if (list? (cadr expr))
|
||||
(every
|
||||
(lambda (x)
|
||||
(if (pair? x) (if (pair? (cdr x)) (null? (cddr x)) #f) #f))
|
||||
(cadr expr))
|
||||
#f)
|
||||
`(,(rename 'let) (,(caar (cdr expr)))
|
||||
(,(rename 'let*) ,(cdar (cdr expr)) ,@(cddr expr)))
|
||||
(error "bad let* syntax")))))
|
||||
(cons 'letrec (lambda (exp rename compare) (letrec=>lets+sets exp)))
|
||||
(cons 'case
|
||||
(lambda (expr rename compare)
|
||||
|
|
Loading…
Add table
Reference in a new issue