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)))))
fields)))
`(begin
(define (,? ,obj)
(and (let? ,obj)
(eq? (let-ref ,obj ',typ) ',type)))
(define ,make
(inlet ',typ ',type ,@args))
,@(map
(lambda (field)
(when (pair? field)
(if (null? (cdr field))
(values)
(if (null? (cddr field))
`(define (,(cadr field) ,obj)
(let-ref ,obj ',(car field)))
`(begin
(define (,(cadr field) ,obj)
(let-ref ,obj ',(car field)))
(define (,(caddr field) ,obj val)
(let-set! ,obj ',(car field) val)))))))
fields)
',type)))
_______________________________________________
Cmdist mailing list
[email protected]
https://cm-mail.stanford.edu/mailman/listinfo/cmdist