* Added make-variable-transformer procedure.
This commit is contained in:
parent
7a3a984653
commit
d515520bd7
BIN
src/ikarus.boot
BIN
src/ikarus.boot
Binary file not shown.
|
@ -9,7 +9,7 @@
|
||||||
(export identifier? syntax-dispatch environment environment?
|
(export identifier? syntax-dispatch environment environment?
|
||||||
eval generate-temporaries free-identifier=?
|
eval generate-temporaries free-identifier=?
|
||||||
bound-identifier=? syntax-error datum->syntax
|
bound-identifier=? syntax-error datum->syntax
|
||||||
syntax->datum
|
syntax->datum make-variable-transformer
|
||||||
eval-r6rs-top-level boot-library-expand eval-top-level)
|
eval-r6rs-top-level boot-library-expand eval-top-level)
|
||||||
(import
|
(import
|
||||||
(r6rs)
|
(r6rs)
|
||||||
|
@ -136,7 +136,7 @@
|
||||||
(set-rtd-printer! (type-descriptor stx)
|
(set-rtd-printer! (type-descriptor stx)
|
||||||
(lambda (x p)
|
(lambda (x p)
|
||||||
(display "#<syntax " p)
|
(display "#<syntax " p)
|
||||||
(display (stx->datum x) p)
|
(write (stx->datum x) p)
|
||||||
(display ">" p))))
|
(display ">" p))))
|
||||||
(define (seal-rib! rib)
|
(define (seal-rib! rib)
|
||||||
(let ([sym* (rib-sym* rib)])
|
(let ([sym* (rib-sym* rib)])
|
||||||
|
@ -442,7 +442,7 @@
|
||||||
(lambda (x)
|
(lambda (x)
|
||||||
(syntax-case x ()
|
(syntax-case x ()
|
||||||
[(_ stx) #'(error #f "invalid syntax ~s" (strip stx '()))]
|
[(_ stx) #'(error #f "invalid syntax ~s" (strip stx '()))]
|
||||||
[(_ stx msg) #'(error #f "~a: ~s" msg (strip stx '()))])))
|
[(_ stx msg) #'(error #f "~a ~s" msg (strip stx '()))])))
|
||||||
(define sanitize-binding
|
(define sanitize-binding
|
||||||
(lambda (x src)
|
(lambda (x src)
|
||||||
(cond
|
(cond
|
||||||
|
@ -451,6 +451,12 @@
|
||||||
(list* 'local-macro! (cdr x) src)]
|
(list* 'local-macro! (cdr x) src)]
|
||||||
[(and (pair? x) (eq? (car x) '$rtd)) x]
|
[(and (pair? x) (eq? (car x) '$rtd)) x]
|
||||||
[else (error 'expand "invalid transformer ~s" x)])))
|
[else (error 'expand "invalid transformer ~s" x)])))
|
||||||
|
(define make-variable-transformer
|
||||||
|
(lambda (x)
|
||||||
|
(if (procedure? x)
|
||||||
|
(cons 'macro! x)
|
||||||
|
(error 'make-variable-transformer
|
||||||
|
"~s is not a procedure" x))))
|
||||||
(define make-eval-transformer
|
(define make-eval-transformer
|
||||||
(lambda (x)
|
(lambda (x)
|
||||||
(sanitize-binding (eval-core x) x)))
|
(sanitize-binding (eval-core x) x)))
|
||||||
|
@ -635,7 +641,7 @@
|
||||||
(syntax-match e ()
|
(syntax-match e ()
|
||||||
[(_ ([lhs* rhs*] ...) b b* ...)
|
[(_ ([lhs* rhs*] ...) b b* ...)
|
||||||
(if (not (valid-bound-ids? lhs*))
|
(if (not (valid-bound-ids? lhs*))
|
||||||
(stx-error e "duplicate identifiers")
|
(stx-error e "invalid identifiers")
|
||||||
(let ([lex* (map gen-lexical lhs*)]
|
(let ([lex* (map gen-lexical lhs*)]
|
||||||
[lab* (map gen-label lhs*)])
|
[lab* (map gen-label lhs*)])
|
||||||
(let ([rib (make-full-rib lhs* lab*)]
|
(let ([rib (make-full-rib lhs* lab*)]
|
||||||
|
@ -779,7 +785,7 @@
|
||||||
[(_ ([lhs* rhs*] ...) b b* ...)
|
[(_ ([lhs* rhs*] ...) b b* ...)
|
||||||
(if (valid-bound-ids? lhs*)
|
(if (valid-bound-ids? lhs*)
|
||||||
(bless `((lambda ,lhs* ,b . ,b*) . ,rhs*))
|
(bless `((lambda ,lhs* ,b . ,b*) . ,rhs*))
|
||||||
(stx-error stx "duplicate bindings"))]
|
(stx-error stx "invalid bindings"))]
|
||||||
[(_ f ([lhs* rhs*] ...) b b* ...) (id? f)
|
[(_ f ([lhs* rhs*] ...) b b* ...) (id? f)
|
||||||
(if (valid-bound-ids? lhs*)
|
(if (valid-bound-ids? lhs*)
|
||||||
(bless `(letrec ([,f (lambda ,lhs* ,b . ,b*)])
|
(bless `(letrec ([,f (lambda ,lhs* ,b . ,b*)])
|
||||||
|
@ -823,7 +829,7 @@
|
||||||
,@command*
|
,@command*
|
||||||
(loop ,@step*))))])
|
(loop ,@step*))))])
|
||||||
(loop ,@init*)))
|
(loop ,@init*)))
|
||||||
(stx-error stx "duplicate bindings"))])])))
|
(stx-error stx "invalid bindings"))])])))
|
||||||
(define let*-macro
|
(define let*-macro
|
||||||
(lambda (stx)
|
(lambda (stx)
|
||||||
(syntax-match stx ()
|
(syntax-match stx ()
|
||||||
|
@ -1770,7 +1776,7 @@
|
||||||
(syntax-match e ()
|
(syntax-match e ()
|
||||||
[(_ ([xlhs* xrhs*] ...) xbody xbody* ...)
|
[(_ ([xlhs* xrhs*] ...) xbody xbody* ...)
|
||||||
(unless (valid-bound-ids? xlhs*)
|
(unless (valid-bound-ids? xlhs*)
|
||||||
(stx-error e "duplicate identifiers"))
|
(stx-error e "invalid identifiers"))
|
||||||
(let* ([xlab* (map gen-label xlhs*)]
|
(let* ([xlab* (map gen-label xlhs*)]
|
||||||
[xrib (make-full-rib xlhs* xlab*)]
|
[xrib (make-full-rib xlhs* xlab*)]
|
||||||
[xb* (map (lambda (x)
|
[xb* (map (lambda (x)
|
||||||
|
@ -1974,7 +1980,7 @@
|
||||||
(syntax-match e ()
|
(syntax-match e ()
|
||||||
[(_ ([xlhs* xrhs*] ...) xbody* ...)
|
[(_ ([xlhs* xrhs*] ...) xbody* ...)
|
||||||
(unless (valid-bound-ids? xlhs*)
|
(unless (valid-bound-ids? xlhs*)
|
||||||
(stx-error e "duplicate identifiers"))
|
(stx-error e "invalid identifiers"))
|
||||||
(let* ([xlab* (map gen-label xlhs*)]
|
(let* ([xlab* (map gen-label xlhs*)]
|
||||||
[xrib (make-full-rib xlhs* xlab*)]
|
[xrib (make-full-rib xlhs* xlab*)]
|
||||||
[xb* (map (lambda (x)
|
[xb* (map (lambda (x)
|
||||||
|
@ -2107,7 +2113,7 @@
|
||||||
[(null? exp*)
|
[(null? exp*)
|
||||||
(let ([id* (map (lambda (x) (stx x top-mark* '())) ext*)])
|
(let ([id* (map (lambda (x) (stx x top-mark* '())) ext*)])
|
||||||
(unless (valid-bound-ids? id*)
|
(unless (valid-bound-ids? id*)
|
||||||
(error #f "duplicate exports of ~s" (find-dups id*))))
|
(error #f "invalid exports of ~s" (find-dups id*))))
|
||||||
(values int* ext*)]
|
(values int* ext*)]
|
||||||
[else
|
[else
|
||||||
(syntax-match (car exp*) ()
|
(syntax-match (car exp*) ()
|
||||||
|
@ -2502,9 +2508,7 @@
|
||||||
(lambda (x . args)
|
(lambda (x . args)
|
||||||
(unless (andmap string? args)
|
(unless (andmap string? args)
|
||||||
(error 'syntax-error "invalid argument ~s" args))
|
(error 'syntax-error "invalid argument ~s" args))
|
||||||
(error #f "~a: ~s"
|
(error #f "~s ~a" (strip x '()) (apply string-append args))))
|
||||||
(apply string-append args)
|
|
||||||
(strip x '()))))
|
|
||||||
(define identifier? (lambda (x) (id? x)))
|
(define identifier? (lambda (x) (id? x)))
|
||||||
(define datum->syntax
|
(define datum->syntax
|
||||||
(lambda (id datum)
|
(lambda (id datum)
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
(define (mk-stats)
|
(define (mk-stats)
|
||||||
(make-stats #f #f #f #f #f #f #f #f #f #f #f #f #f))
|
(make-stats #f #f #f #f #f #f #f #f #f #f #f #f #f))
|
||||||
|
|
||||||
|
(define verbose-timer (make-parameter #f))
|
||||||
|
|
||||||
(define (set-stats! t)
|
(define (set-stats! t)
|
||||||
(foreign-call "ikrt_stats_now" t))
|
(foreign-call "ikrt_stats_now" t))
|
||||||
|
|
||||||
|
@ -48,16 +50,17 @@
|
||||||
(stats-real-usecs t1) (stats-real-usecs t0))
|
(stats-real-usecs t1) (stats-real-usecs t0))
|
||||||
(msecs (stats-gc-real-secs t1) (stats-gc-real-secs t0)
|
(msecs (stats-gc-real-secs t1) (stats-gc-real-secs t0)
|
||||||
(stats-gc-real-usecs t1) (stats-gc-real-usecs t0)))
|
(stats-gc-real-usecs t1) (stats-gc-real-usecs t0)))
|
||||||
(print-time "user"
|
(when (verbose-timer)
|
||||||
(msecs (stats-user-secs t1) (stats-user-secs t0)
|
(print-time "user"
|
||||||
(stats-user-usecs t1) (stats-user-usecs t0))
|
(msecs (stats-user-secs t1) (stats-user-secs t0)
|
||||||
(msecs (stats-gc-user-secs t1) (stats-gc-user-secs t0)
|
(stats-user-usecs t1) (stats-user-usecs t0))
|
||||||
(stats-gc-user-usecs t1) (stats-gc-user-usecs t0)))
|
(msecs (stats-gc-user-secs t1) (stats-gc-user-secs t0)
|
||||||
(print-time "sys"
|
(stats-gc-user-usecs t1) (stats-gc-user-usecs t0)))
|
||||||
(msecs (stats-sys-secs t1) (stats-sys-secs t0)
|
(print-time "sys"
|
||||||
(stats-sys-usecs t1) (stats-sys-usecs t0))
|
(msecs (stats-sys-secs t1) (stats-sys-secs t0)
|
||||||
(msecs (stats-gc-sys-secs t1) (stats-gc-sys-secs t0)
|
(stats-sys-usecs t1) (stats-sys-usecs t0))
|
||||||
(stats-gc-sys-usecs t1) (stats-gc-sys-usecs t0)))
|
(msecs (stats-gc-sys-secs t1) (stats-gc-sys-secs t0)
|
||||||
|
(stats-gc-sys-usecs t1) (stats-gc-sys-usecs t0))))
|
||||||
(printf " ~a bytes allocated\n" bytes))
|
(printf " ~a bytes allocated\n" bytes))
|
||||||
|
|
||||||
(define (print-stats-old message bytes t1 t0)
|
(define (print-stats-old message bytes t1 t0)
|
||||||
|
|
|
@ -609,6 +609,7 @@
|
||||||
[bound-identifier=? i syncase]
|
[bound-identifier=? i syncase]
|
||||||
[syntax->datum i syncase]
|
[syntax->datum i syncase]
|
||||||
[datum->syntax i syncase]
|
[datum->syntax i syncase]
|
||||||
|
[make-variable-transformer i syncase]
|
||||||
[code? i]
|
[code? i]
|
||||||
[immediate? i]
|
[immediate? i]
|
||||||
[pointer-value i]
|
[pointer-value i]
|
||||||
|
|
|
@ -728,14 +728,14 @@
|
||||||
[syntax C sc]
|
[syntax C sc]
|
||||||
[syntax->datum C sc]
|
[syntax->datum C sc]
|
||||||
[syntax-case C sc]
|
[syntax-case C sc]
|
||||||
[unsyntax S sc]
|
[unsyntax C sc]
|
||||||
[unsyntax-splicing S sc]
|
[unsyntax-splicing C sc]
|
||||||
[quasisyntax S sc]
|
[quasisyntax C sc]
|
||||||
[with-syntax C sc]
|
[with-syntax C sc]
|
||||||
[free-identifier=? C sc]
|
[free-identifier=? C sc]
|
||||||
[generate-temporaries C sc]
|
[generate-temporaries C sc]
|
||||||
[identifier? C sc]
|
[identifier? C sc]
|
||||||
[make-variable-transformer S sc]
|
[make-variable-transformer C sc]
|
||||||
;;;
|
;;;
|
||||||
[char-alphabetic? S uc se]
|
[char-alphabetic? S uc se]
|
||||||
[char-ci<=? C uc se]
|
[char-ci<=? C uc se]
|
||||||
|
|
Loading…
Reference in New Issue