declare core syntaces individually separate from (scheme base)
This commit is contained in:
parent
038020ff9f
commit
49c0330fb7
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue