Name clause Marc Nieper-Wißkirchen (02 Nov 2022 15:07 UTC)
Re: Name clause Marc Nieper-Wißkirchen (03 Nov 2022 19:51 UTC)

Name clause Marc Nieper-Wißkirchen 02 Nov 2022 15:07 UTC

Both the R6RS and the R7RS define-record-type syntaxes have one
limitation in common: The record name (useful for inspection or
debugging) is always the symbolic name of the identifier the <record
name> is bound to.

This is problematic if the identifier should be bound to something
else without renaming the record name as in the following example:

(define-record-type thunk
  (fields proc)
  (protocol
    (lambda (p)
      (lambda (proc) (assert (procedure? proc)) (p proc)))))

(define-syntax thunk
  (syntax-rules ()
    [(_ body ...) (make-thunk (lambda () body ...)]))

Unless one has local modules allowing local renaming exports, the only
way out is to use the renaming facility of the library system.

Thus I propose the addition of a

(name <symbol>)

clause (for the R6RS syntax and the proposed extension of the R7RS) to
specify the record name explicitly.  The above record-type definition
can then be corrected:

(define-record-type (<thunk> make-thunk thunk?)
  (name thunk)
  (fields proc)
  ...)

Alternatively, we could extend the <name spec> (see the R6RS document)
so that it allows to separate name and bound identifier:

(define-record-type (thunk <thunk>)
  (fields proc)
  ....)

Marc