.
original commit: 18d7e54bedb46e00c16fdc28b14f6383812369be
This commit is contained in:
parent
b3026df612
commit
7d6762f989
|
@ -1,13 +1,12 @@
|
|||
|
||||
(module include mzscheme
|
||||
(require-for-syntax (lib "stx.ss" "syntax"))
|
||||
|
||||
(define-syntax include
|
||||
(lambda (stx)
|
||||
;; Parse the file name
|
||||
(let ([file
|
||||
(syntax-case* stx (build-path) (lambda (a b)
|
||||
(eq? (syntax-e a)
|
||||
(syntax-e b)))
|
||||
(syntax-case* stx (build-path) module-or-top-identifier=?
|
||||
[(_ fn)
|
||||
(string? (syntax-e (syntax fn)))
|
||||
(syntax-e (syntax fn))]
|
||||
|
@ -15,8 +14,10 @@
|
|||
(andmap
|
||||
(lambda (e)
|
||||
(or (string? (syntax-e e))
|
||||
(module-identifier=? e (quote-syntax up))
|
||||
(module-identifier=? e (quote-syntax same))))
|
||||
(and (identifier? e)
|
||||
(or
|
||||
(module-identifier=? e (quote-syntax up))
|
||||
(module-identifier=? e (quote-syntax same))))))
|
||||
(syntax->list (syntax (elem1 elem ...))))
|
||||
(apply build-path (syntax-object->datum (syntax (elem1 elem ...))))])])
|
||||
;; Complete the file name
|
||||
|
|
|
@ -1,99 +1,15 @@
|
|||
|
||||
(module shared mzscheme
|
||||
(require-for-syntax (lib "stx.ss" "syntax")
|
||||
(lib "kerncase.ss" "syntax")
|
||||
"include.ss")
|
||||
|
||||
(provide shared)
|
||||
|
||||
(define undefined (letrec ([x x]) x))
|
||||
(require (rename mzscheme the-cons cons))
|
||||
|
||||
(define-syntax shared
|
||||
(lambda (stx)
|
||||
(syntax-case stx ()
|
||||
[(_ ([name expr] ...) body1 body ...)
|
||||
(let ([names (syntax->list (syntax (name ...)))]
|
||||
[exprs (syntax->list (syntax (expr ...)))])
|
||||
(for-each (lambda (name)
|
||||
(unless (identifier? name)
|
||||
(raise-syntax-error
|
||||
'shared
|
||||
"not an identifier"
|
||||
stx
|
||||
name)))
|
||||
names)
|
||||
(let ([dup (check-duplicate-identifier names)])
|
||||
(when dup
|
||||
(raise-syntax-error
|
||||
'shared
|
||||
"duplicate identifier"
|
||||
stx
|
||||
dup)))
|
||||
(with-syntax ([(init-expr ...)
|
||||
(map (lambda (expr)
|
||||
(define (bad n)
|
||||
(raise-syntax-error
|
||||
'shared
|
||||
(format "illegal use of ~a" n)
|
||||
stx
|
||||
expr))
|
||||
(syntax-case expr (cons list box vector)
|
||||
[(cons a d)
|
||||
(syntax (cons undefined undefined))]
|
||||
[(cons . _)
|
||||
(bad "list")]
|
||||
[(list e ...)
|
||||
(with-syntax ([(e ...)
|
||||
(map (lambda (x) (syntax undefined))
|
||||
(syntax->list (syntax (e ...))))])
|
||||
(syntax (list e ...)))]
|
||||
[(list . _)
|
||||
(bad "list")]
|
||||
[(box v)
|
||||
(syntax (box undefined))]
|
||||
[(box . _)
|
||||
(bad "box")]
|
||||
[(vector e ...)
|
||||
(with-syntax ([(e ...)
|
||||
(map (lambda (x) (syntax undefined))
|
||||
(syntax->list (syntax (e ...))))])
|
||||
(syntax (vector e ...)))]
|
||||
[(vector . _)
|
||||
(bad "vector")]
|
||||
[_else expr]))
|
||||
exprs)]
|
||||
[(finish-expr ...)
|
||||
(let ([gen-n (lambda (l)
|
||||
(let loop ([l l][n 0])
|
||||
(if (null? l)
|
||||
null
|
||||
(cons (datum->syntax-object (quote-syntax here) n #f)
|
||||
(loop (cdr l) (add1 n))))))])
|
||||
(map (lambda (name expr)
|
||||
(with-syntax ([name name])
|
||||
(syntax-case expr (cons list box vector)
|
||||
[(cons a d)
|
||||
(syntax (begin
|
||||
(set-car! name a)
|
||||
(set-cdr! name d)))]
|
||||
[(list e ...)
|
||||
(with-syntax ([(n ...) (gen-n (syntax->list (syntax (e ...))))])
|
||||
(syntax (let ([lst name])
|
||||
(set-car! (list-tail lst n) e)
|
||||
...)))]
|
||||
[(box v)
|
||||
(syntax (set-box! name v))]
|
||||
[(vector e ...)
|
||||
(with-syntax ([(n ...) (gen-n (syntax->list (syntax (e ...))))])
|
||||
(syntax (let ([vec name])
|
||||
(vector-set! vec n e)
|
||||
...)))]
|
||||
[_else (syntax (void))])))
|
||||
names exprs))])
|
||||
(syntax
|
||||
(letrec ([name init-expr] ...)
|
||||
finish-expr
|
||||
...
|
||||
body1
|
||||
body
|
||||
...))))]))))
|
||||
|
||||
|
||||
|
||||
(define make-check-cdr #f)
|
||||
(include (build-path "private" "shared-body.ss")))))
|
||||
|
|
Loading…
Reference in New Issue
Block a user