(module datatype-printer-props mzscheme
  (require (lib "pconvert-prop.ss"))
  (provide datatype-printer-props)
  ;; the printer is created here in a aseparate module, because datatype.ss is
  ;; re-used in a lazy-scheme context and in that case we still need the
  ;; printer to be eager (otherwise the write/display call generates a promise
  ;; and nothing else).
  (define (datatype-printer x port write?)
    ((if write? write display)
     (let ([l (vector->list (struct->vector x))])
       (cons (string->symbol
              (regexp-replace #rx"^struct:" (symbol->string (car l)) ""))
             (cdr l)))
  (define datatype-printer-props
    `(;; always show as constructor-style
      (,prop:custom-write . ,datatype-printer)
      ;; also when constructor-style is used
      (,prop:print-convert-constructor-name . variant))))