1
Fork 0
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:
Andy Wingo 2014-03-28 14:21:06 +01:00
parent ecc7987427
commit 9a1dfb7d2e
4 changed files with 70 additions and 41 deletions

View file

@ -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)))