mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-24 12:20:20 +02:00
Continuation labels and variable identifiers may be integers
* module/language/cps.scm (label-counter, var-counter): New parameters, for producing fresh label and var names. (fresh-label, fresh-var): New procedures. (let-fresh): New macro, will replace let-gensyms. (build-cps-term): Use let-fresh. * module/language/tree-il/compile-cps.scm: Use let-fresh to generate fresh names. * module/system/vm/assembler.scm (make-meta, begin-kw-arity): Allow exact integers as labels. (link-debug): Explicitly mark low-pc as being an "addr" value.
This commit is contained in:
parent
ecc7987427
commit
9a1dfb7d2e
4 changed files with 70 additions and 41 deletions
|
@ -123,8 +123,12 @@
|
|||
;; Expressions.
|
||||
$void $const $prim $fun $call $callk $primcall $values $prompt
|
||||
|
||||
;; Fresh names.
|
||||
label-counter var-counter
|
||||
fresh-label fresh-var
|
||||
let-fresh let-gensyms
|
||||
|
||||
;; Building macros.
|
||||
let-gensyms
|
||||
build-cps-term build-cps-cont build-cps-exp
|
||||
rewrite-cps-term rewrite-cps-cont rewrite-cps-exp
|
||||
|
||||
|
@ -187,6 +191,26 @@
|
|||
(define-cps-type $values args)
|
||||
(define-cps-type $prompt escape? tag handler)
|
||||
|
||||
(define label-counter (make-parameter #f))
|
||||
(define var-counter (make-parameter #f))
|
||||
|
||||
(define (fresh-label)
|
||||
(let ((count (label-counter)))
|
||||
(label-counter (1+ count))
|
||||
count))
|
||||
|
||||
;; FIXME: Currently vars and labels need to be unique, so we use the
|
||||
;; label counter.
|
||||
(define (fresh-var)
|
||||
(let ((count (label-counter)))
|
||||
(label-counter (1+ count))
|
||||
count))
|
||||
|
||||
(define-syntax-rule (let-fresh (label ...) (var ...) body ...)
|
||||
(let ((label (fresh-label)) ...
|
||||
(var (fresh-var)) ...)
|
||||
body ...))
|
||||
|
||||
(define-syntax let-gensyms
|
||||
(syntax-rules ()
|
||||
((_ (sym ...) body body* ...)
|
||||
|
@ -261,7 +285,7 @@
|
|||
((_ ($letconst () body))
|
||||
(build-cps-term body))
|
||||
((_ ($letconst ((name sym val) tail ...) body))
|
||||
(let-gensyms (kconst)
|
||||
(let-fresh (kconst) ()
|
||||
(build-cps-term
|
||||
($letk ((kconst ($kargs (name) (sym) ($letconst (tail ...) body))))
|
||||
($continue kconst (let ((props (source-properties val)))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue