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:
parent
d9d671f76e
commit
34898db352
1 changed files with 5 additions and 3 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue