Previous: , Up: progutils   [Index]


8.2 Expanding programs

The following bindings are exported by the library (vicare libraries).

Function: expand-top-level-program sexp

Expand an R6RS program whose symbolic expression is sexp. Return 6 values:

invoke-lib*

A list of library objects representing the libraries that need to be invoked to run the code.

invoke-code

The fully expanded code from the body of the program.

macro*

A list of sublists representing the macros defined in the program.

export-subst

A subst representing the top–level bindings.

global-env

A list representing the bindings exported by the program.

option*

A list of symbols representing the options enabled for this program; iklib programs for details.

Function: expand-top-level-program->sexp sexp

This function is for debugging purposes. Expand the program form sexp and return the return values of expand-top-level-program in an alist with the following symbols as keys:

invoke-lib* invoke-code
visit-code
export-subst global-env
option*

We can toy with the program expander using the following code:

#!r6rs
(import (vicare)
  (prefix (vicare programs) progs.))
(print-gensym #f)
(print-graph  #f)
(debug-print (progs.expand-top-level-program->sexp ?sexp))

where ?sexp is the program symbolic expression. For example, expanding the program:

(import (vicare))
(define var 1)
(define-syntax (mac stx)
  2)
(display var)

yields the invoke-code:

(library-letrec*
    ((lex.var   loc.lex.var   '1)
     (lex.dummy loc.lex.dummy
        (begin
          (annotated-call (display var)
             (primitive display) lex.var)
          '#!void)))
  '#!void)

the visit-code:

(set! loc.lab.mac
      (annotated-case-lambda
          (#'lambda #'stx #'2)
        ((lex.stx) '2)))

where the procedure is the result of compiling and evaluating the expanded code; the export-subst (with many entries removed):

((flmod          . g2374)
 (flonum->string . g990)
 (flsquare       . g743)
 ...
 (var            . lab.var)
 (mac            . lab.mac))

the global-env:

((lab.var global       . loc.lex.var)
 (lab.mac global-macro . loc.lab.mac))

Previous: , Up: progutils   [Index]