I see you dispatch via cond:
(define (type-identifier obj) (cond ((number? obj) 'number) ((string? obj) 'string) ((symbol? obj) 'symbol) ((boolean? obj) 'boolean) ((null? obj) 'null) ((pair? obj) 'pair) ((vector? obj) 'vector) ((procedure? obj) 'procedure) (else 'other)))
When I was writing the Clojure->Gambit polymorphic dispatch I reached immediately for case and branched on the numerical value of the type/subtype id assuming I'd get fast constant time dispatch. This cond as you've written would be a linear search, would it not? Or is Gambit able to see that these predicates can be dispatched to in constant time via type tag info?