(define-macro (bconc! #!rest rst)
(let ((gr (gensym)) (gb (gensym)))
`(let loop ((,gr (list ,@rst))
(,gb (if (null? *b-end*) *b-head* *b-end*)))
(cond
((null? ,gr)
(set! *b-end* ,gb)
(if (or (null? ,gb) (eq? ,gb *b-head*)) ,gb (cdr ,gb)))
((null? ,gb)
(set! ,gb (car ,gr))
(set! *b-head* ,gb)
(loop (cdr ,gr) ,gb))
(else
(set! ,gb (to-last ,gb))
(set-cdr! ,gb (car ,gr))
(loop (cdr ,gr) ,gb))))))
(define-macro (blink! e)
(let ((ge (gensym)))
`(let ((,ge ,e))
(bconc! (list ,ge))
,ge)))
(define-macro (bpush! e)
`(push! *b-head* ,e))
(define-macro (bbuilt! #!optional lst)
(let ((gl (gensym)))
`(let ((,gl ,lst))
(if (list? ,gl)
(begin
(set! *b-head* ,gl)
(set! *b-end* ,gl)
,gl)
*b-head*))))
(define-macro (build-list! #!rest body)
`(let ((*b-head* '()) (*b-end* '()))
(begin ,@body)
*b-head*))