declare core syntaces individually separate from (scheme base)

This commit is contained in:
Yuichi Nishiwaki 2013-12-09 23:00:47 -08:00
parent 038020ff9f
commit 49c0330fb7
1 changed files with 203 additions and 159 deletions

View File

@ -1,14 +1,16 @@
;;; hygienic macros ;;; hygienic macros
(define-library (picrin macro)
(import (scheme base))
(define (sc-macro-transformer f) (define (sc-macro-transformer f)
(lambda (expr use-env mac-env) (lambda (expr use-env mac-env)
(make-syntactic-closure mac-env '() (f expr use-env)))) (make-syntactic-closure mac-env '() (f expr use-env))))
(define (rsc-macro-transformer f) (define (rsc-macro-transformer f)
(lambda (expr use-env mac-env) (lambda (expr use-env mac-env)
(make-syntactic-closure use-env '() (f expr mac-env)))) (make-syntactic-closure use-env '() (f expr mac-env))))
(define (er-macro-transformer f) (define (er-macro-transformer f)
(lambda (expr use-env mac-env) (lambda (expr use-env mac-env)
(define (rename identifier) (define (rename identifier)
(make-syntactic-closure mac-env '() identifier)) (make-syntactic-closure mac-env '() identifier))
@ -16,13 +18,13 @@
(identifier=? use-env x use-env y)) (identifier=? use-env x use-env y))
(make-syntactic-closure use-env '() (f expr rename compare)))) (make-syntactic-closure use-env '() (f expr rename compare))))
(define (walk f obj) (define (walk f obj)
(if (pair? obj) (if (pair? obj)
(cons (walk f (car obj)) (cons (walk f (car obj))
(walk f (cdr obj))) (walk f (cdr obj)))
(f obj))) (f obj)))
(define (ir-macro-transformer f) (define (ir-macro-transformer f)
(lambda (expr use-env mac-env) (lambda (expr use-env mac-env)
(define (inject identifier) (define (inject identifier)
(make-syntactic-closure use-env '() identifier)) (make-syntactic-closure use-env '() identifier))
@ -32,48 +34,30 @@
(walk (lambda (x) (if (symbol? x) (inject x) x)) expr)) (walk (lambda (x) (if (symbol? x) (inject x) x)) expr))
(make-syntactic-closure mac-env '() (f renamed inject compare)))) (make-syntactic-closure mac-env '() (f renamed inject compare))))
;;; Core syntaxes (export sc-macro-transformer
rsc-macro-transformer
er-macro-transformer
ir-macro-transformer))
(define (list . args) ;;; core syntaces
args) (define-library (picrin core-syntax)
(import (scheme base)
(picrin macro))
(define (caar p) (define (list . args) args)
(car (car p)))
(define (cadr p) (define (caar p) (car (car p)))
(car (cdr p))) (define (cadr p) (car (cdr p)))
(define (cdar p) (cdr (car p)))
(define (cddr p) (cdr (cdr p)))
(define (cdar p) (define (map f list)
(cdr (car p)))
(define (cddr p)
(cdr (cdr p)))
(define (any pred list)
(if (null? list) (if (null? list)
#f list
((lambda (it)
(if it
it
(any pred (cdr list))))
(pred (car list)))))
(define (map f list . lists)
(define (single-map f list)
(if (null? list)
'()
(cons (f (car list)) (cons (f (car list))
(map f (cdr list))))) (map f (cdr list)))))
(define (multiple-map f lists)
(if (any null? lists)
'()
(cons (apply f (single-map car lists))
(multiple-map f (single-map cdr lists)))))
(if (null? lists)
(single-map f list)
(multiple-map f (cons list lists))))
(define-macro (let bindings . body) (define-macro (let bindings . body)
(if (symbol? bindings) (if (symbol? bindings)
(begin (begin
(define name bindings) (define name bindings)
@ -92,7 +76,7 @@
(cons (cons 'lambda (cons (map car bindings) body)) (cons (cons 'lambda (cons (map car bindings) body))
(map cadr bindings)))) (map cadr bindings))))
(define-macro (cond . clauses) (define-macro (cond . clauses)
(if (null? clauses) (if (null? clauses)
#f #f
(let ((c (car clauses))) (let ((c (car clauses)))
@ -101,14 +85,14 @@
(if-false (cons 'cond (cdr clauses)))) (if-false (cons 'cond (cdr clauses))))
(list 'if test if-true if-false))))) (list 'if test if-true if-false)))))
(define-macro (and . exprs) (define-macro (and . exprs)
(if (null? exprs) (if (null? exprs)
#t #t
(let ((test (car exprs)) (let ((test (car exprs))
(if-true (cons 'and (cdr exprs)))) (if-true (cons 'and (cdr exprs))))
(list 'if test if-true #f)))) (list 'if test if-true #f))))
(define-macro (or . exprs) (define-macro (or . exprs)
(if (null? exprs) (if (null? exprs)
#f #f
(let ((test (car exprs)) (let ((test (car exprs))
@ -116,13 +100,13 @@
(list 'let (list (list 'it test)) (list 'let (list (list 'it test))
(list 'if 'it 'it if-false))))) (list 'if 'it 'it if-false)))))
(define (append xs ys) (define (append xs ys)
(if (null? xs) (if (null? xs)
ys ys
(cons (car xs) (cons (car xs)
(append (cdr xs) ys)))) (append (cdr xs) ys))))
(define-macro (quasiquote x) (define-macro (quasiquote x)
(cond (cond
((symbol? x) (list 'quote x)) ((symbol? x) (list 'quote x))
((pair? x) ((pair? x)
@ -136,7 +120,7 @@
(list 'quasiquote (cdr x)))))) (list 'quasiquote (cdr x))))))
(#t x))) (#t x)))
(define-macro (let* bindings . body) (define-macro (let* bindings . body)
(if (null? bindings) (if (null? bindings)
`(let () ,@body) `(let () ,@body)
`(let ((,(caar bindings) `(let ((,(caar bindings)
@ -144,17 +128,17 @@
(let* (,@(cdr bindings)) (let* (,@(cdr bindings))
,@body)))) ,@body))))
(define-macro (letrec bindings . body) (define-macro (letrec bindings . body)
(let ((vars (map (lambda (v) `(,v #f)) (map car bindings))) (let ((vars (map (lambda (v) `(,v #f)) (map car bindings)))
(initials (map (lambda (v) `(set! ,@v)) bindings))) (initials (map (lambda (v) `(set! ,@v)) bindings)))
`(let (,@vars) `(let (,@vars)
(begin ,@initials) (begin ,@initials)
,@body))) ,@body)))
(define-macro (letrec* . args) (define-macro (letrec* . args)
`(letrec ,@args)) `(letrec ,@args))
(define-macro (do bindings finish . body) (define-macro (do bindings finish . body)
`(let loop ,(map (lambda (x) `(let loop ,(map (lambda (x)
(list (car x) (cadr x))) (list (car x) (cadr x)))
bindings) bindings)
@ -167,13 +151,13 @@
bindings))) bindings)))
(begin ,@(cdr finish))))) (begin ,@(cdr finish)))))
(define-macro (when test . exprs) (define-macro (when test . exprs)
(list 'if test (cons 'begin exprs) #f)) (list 'if test (cons 'begin exprs) #f))
(define-macro (unless test . exprs) (define-macro (unless test . exprs)
(list 'if test #f (cons 'begin exprs))) (list 'if test #f (cons 'begin exprs)))
(define-syntax define-auxiliary-syntax (define-syntax define-auxiliary-syntax
(ir-macro-transformer (ir-macro-transformer
(lambda (expr i c) (lambda (expr i c)
`(define-syntax ,(cadr expr) `(define-syntax ,(cadr expr)
@ -181,12 +165,53 @@
(lambda (expr env) (lambda (expr env)
(error "invalid use of auxiliary syntax"))))))) (error "invalid use of auxiliary syntax")))))))
(define-auxiliary-syntax else) (define-auxiliary-syntax else)
(define-auxiliary-syntax =>) (define-auxiliary-syntax =>)
(define-auxiliary-syntax _) (define-auxiliary-syntax _)
(define-auxiliary-syntax ...) (define-auxiliary-syntax ...)
(define-auxiliary-syntax unquote) (define-auxiliary-syntax unquote)
(define-auxiliary-syntax unquote-splicing) (define-auxiliary-syntax unquote-splicing)
(export let let* letrec letrec*
quasiquote unquote unquote-splicing
and or
cond else =>
do
when unless
_ ...))
(import (picrin macro)
(picrin core-syntax))
(define (list . args)
args)
(define (caar p)
(car (car p)))
(define (cadr p)
(car (cdr p)))
(define (cdar p)
(cdr (car p)))
(define (cddr p)
(cdr (cdr p)))
(define (append xs ys)
(if (null? xs)
ys
(cons (car xs)
(append (cdr xs) ys))))
(define (any pred list)
(if (null? list)
#f
((lambda (it)
(if it
it
(any pred (cdr list))))
(pred (car list)))))
(define (every pred list) (define (every pred list)
(if (null? list) (if (null? list)
@ -383,7 +408,11 @@
(define-macro (define-char-transitive-predicate name op) (define-macro (define-char-transitive-predicate name op)
`(define (,name . cs) `(define (,name . cs)
(apply ,op (map char->integer cs)))) (letrec ((map (lambda (f list)
(if (null? list)
list
(cons (f (car list)) (map f (cdr list)))))))
(apply ,op (map char->integer cs)))))
(define-char-transitive-predicate char=? =) (define-char-transitive-predicate char=? =)
(define-char-transitive-predicate char<? <) (define-char-transitive-predicate char<? <)
@ -561,6 +590,21 @@
;;; 6.10 control features ;;; 6.10 control features
(define (map f list . lists)
(define (single-map f list)
(if (null? list)
'()
(cons (f (car list))
(map f (cdr list)))))
(define (multiple-map f lists)
(if (any null? lists)
'()
(cons (apply f (single-map car lists))
(multiple-map f (single-map cdr lists)))))
(if (null? lists)
(single-map f list)
(multiple-map f (cons list lists))))
(define (for-each f list . lists) (define (for-each f list . lists)
(define (single-for-each f list) (define (single-for-each f list)
(if (null? list) (if (null? list)