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:
AlexKnauth 2019-03-17 22:54:11 -04:00 committed by Ryan Culpepper
parent 1efe1ebbf1
commit 780647f0eb

View File

@ -4,17 +4,22 @@
(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])
(unless (syntax? ref-stx)
(raise-type-error 'make-variable-like-transformer "syntax?" ref-stx))
(unless (or (syntax? ref-stx) (procedure? 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))
(raise-type-error 'make-variable-like-transformer "(or/c syntax? procedure? #f)" set!-handler))
(make-set!-transformer
(variable-like-transformer
(lambda (stx)
(syntax-case stx (set!)
[id
(identifier? #'id)
ref-stx]
(cond [(procedure? ref-stx) (ref-stx stx)]
[else ref-stx])]
[(set! id val)
(cond [(procedure? set!-handler)
(set!-handler stx)]