[CM] Unexpected behavior of record types in lists

bil at ccrma.Stanford.EDU bil at ccrma.Stanford.EDU
Tue May 17 06:26:33 PDT 2022

Thanks for the bug report.  I think that was an
overlooked name collision in the macro.  I
haven't tested this much, but here's a possible
new version:

(define-macro (define-record-type type make ? . fields)
   (let ((obj (gensym))
	(typ (gensym))
	(args (map (lambda (field)
		     (values (list 'quote (car field))
			     (let ((par (memq (car field) (cdr make))))
			       (and (pair? par) (car par)))))
        (define (,? ,obj)
	 (and (let? ,obj)
	      (eq? (let-ref ,obj ',typ) ',type)))

        (define ,make
          (inlet ',typ ',type , at args))

	  (lambda (field)
	    (when (pair? field)
	      (if (null? (cdr field))
		  (if (null? (cddr field))
		      `(define (,(cadr field) ,obj)
			 (let-ref ,obj ',(car field)))
			 (define (,(cadr field) ,obj)
			   (let-ref ,obj ',(car field)))
			 (define (,(caddr field) ,obj val)
			   (let-set! ,obj ',(car field) val)))))))

More information about the Cmdist mailing list