On 25.11.2021 18:45, Jean Abou Samra wrote: > Record types are self-evaluating: > > scheme@(guile-user)> (eval (make-record-type 'my-record '()) (current-module)) > $1 = #<record-type my-record> > > Yet, when a macro returns a record type, Guile fails > to byte-compile the code, even though the execution > (via the evaluator) works fine. Here is a simple example: > > > (define-macro (my-macro) > (make-record-type 'my-record-2 '())) > > (display (my-macro)) > (newline) > > > Execution log: > > > $ guile --no-auto-compile test.scm > #<record-type my-record-2> > > $ guile test.scm > ;;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0 > ;;; or pass the --no-auto-compile argument to disable. > ;;; compiling /home/jean/test.scm > ;;; WARNING: compilation of /home/jean/test.scm failed: > ;;; unhandled constant #<record-type my-record-2> > #<record-type my-record-2> > > This is with Guile version 3.0.5.130-5a1e7.
I don't think that's supposed to work. I find it surprising that record-type objects are self-evaluating, and in any case they can't be turned into bytecode. Your macro could return code that evaluates to a record definition. Would that solve your use-case? -- Taylan