Thanks to both of you.
It does expand to a
reasonably large amount of code, a small example is below. The
processing that define-schema does shouldn't be worse than O(N*M) where N
is the number of tables and M is the number of unique procedure names.
Which is not linear, but also probably not large enough to be the main
culprit. I added `(println stx-being-returned)` to define-schema and it
gets printed relatively quickly. So probably the size of the generated code is
the main culprit. I'll try Ryan C's tips as soon as I have time; they
look promising.
(define-schema $$
(table A
#:property
[foo (%%scalar "foo-given-A" this)])
(table B
#:property
[foo (%%scalar "foo-given-B" this)]
[bar (%%scalar "bar-given-B" this)]))
; Approximately expands to
#;(begin
(define A (make-table 'A))
(define B (make-table 'B))
(define (foo x)
(cond
[((instanceof A) x)
(%%scalar "foo-given-A" x)]
[((instanceof B) x)
(%%scalar "foo-given-B" x)]
[else (error "expected instanceof A or B, got" x)]))
(define (bar x)
(cond
[((instanceof B) x)
(%%scalar "bar-given-B" x)]
[else (error "expected instanceof B, got" x)])))