1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-20 11:40:18 +02:00

inline record predicates into record-case

* module/system/base/syntax.scm (record-case): Inline record predicates
  into the record-case. Shaves off a few more milliseconds from a GOOPS
  load.
This commit is contained in:
Andy Wingo 2009-02-13 00:16:44 +01:00
parent d9d671f76e
commit 34898db352

View file

@ -165,7 +165,8 @@
(define-macro (record-case record . clauses)
(let ((r (gensym)))
(let ((r (gensym))
(rtd (gensym)))
(define (process-clause clause)
(if (eq? (car clause) 'else)
clause
@ -173,14 +174,15 @@
(slots (cdar clause))
(body (cdr clause)))
(let ((stem (symbol-trim-both record-type (list->char-set '(#\< #\>)))))
`((,(symbol-append stem '?) ,r)
`((eq? ,rtd ,record-type)
(let ,(map (lambda (slot)
(if (pair? slot)
`(,(car slot) (,(symbol-append stem '- (cadr slot)) ,r))
`(,slot (,(symbol-append stem '- slot) ,r))))
slots)
,@body))))))
`(let ((,r ,record))
`(let* ((,r ,record)
(,rtd (struct-vtable ,r)))
(cond ,@(let ((clauses (map process-clause clauses)))
(if (assq 'else clauses)
clauses