return a procedure from make-variable-like-transformer
So that make-variable-like-transformer produces a value that passes both procedure? and set!-transformer?
This commit is contained in:
parent
1efe1ebbf1
commit
780647f0eb
|
@ -4,17 +4,22 @@
|
||||||
|
|
||||||
(provide make-variable-like-transformer)
|
(provide make-variable-like-transformer)
|
||||||
|
|
||||||
|
(struct variable-like-transformer [procedure]
|
||||||
|
#:property prop:procedure (struct-field-index procedure)
|
||||||
|
#:property prop:set!-transformer (struct-field-index procedure))
|
||||||
|
|
||||||
(define (make-variable-like-transformer ref-stx [set!-handler #f])
|
(define (make-variable-like-transformer ref-stx [set!-handler #f])
|
||||||
(unless (syntax? ref-stx)
|
(unless (or (syntax? ref-stx) (procedure? ref-stx))
|
||||||
(raise-type-error 'make-variable-like-transformer "syntax?" ref-stx))
|
(raise-type-error 'make-variable-like-transformer "(or/c syntax? procedure?)" ref-stx))
|
||||||
(unless (or (syntax? set!-handler) (procedure? set!-handler) (eq? set!-handler #f))
|
(unless (or (syntax? set!-handler) (procedure? set!-handler) (eq? set!-handler #f))
|
||||||
(raise-type-error 'make-variable-like-transformer "(or/c syntax? procedure? #f)" set!-handler))
|
(raise-type-error 'make-variable-like-transformer "(or/c syntax? procedure? #f)" set!-handler))
|
||||||
(make-set!-transformer
|
(variable-like-transformer
|
||||||
(lambda (stx)
|
(lambda (stx)
|
||||||
(syntax-case stx (set!)
|
(syntax-case stx (set!)
|
||||||
[id
|
[id
|
||||||
(identifier? #'id)
|
(identifier? #'id)
|
||||||
ref-stx]
|
(cond [(procedure? ref-stx) (ref-stx stx)]
|
||||||
|
[else ref-stx])]
|
||||||
[(set! id val)
|
[(set! id val)
|
||||||
(cond [(procedure? set!-handler)
|
(cond [(procedure? set!-handler)
|
||||||
(set!-handler stx)]
|
(set!-handler stx)]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user