Next: libutils loading, Previous: libutils interning, Up: libutils [Index]
The following bindings are exported by the library (vicare
libraries).
Expand the symbolic expression sexp and intern the result
(see libutils interning). When successful: return a
<library> object; if an error occurs: raise an exception.
sexp must be a symbolic expression (library . ---)
representing a R6RS library form with optional Vicare
extensions.
The optional filename must be #f or a string representing
the source file from which the library was loaded; it is used for
information purposes. When not given defaults to #f.
The optional argument verify-libname must be a procedure accepting a R6RS library name as argument and returning unspecified values; it is meant to perform some validation upon the library name components and raise an exception if something is wrong; otherwise it should just return.
This function is for debugging purposes. Expand the library form
sexp and return the return values of expand-library in an
alist with the following symbols as keys:
uid libname import-libdesc* visit-libdesc* invoke-libdesc* invoke-code visit-code export-subst global-env guard-code guard-libdesc* option*
We can toy with the library expander using the following code:
#!r6rs (import (vicare) (prefix (vicare libraries) libs.)) (print-gensym #f) (debug-print (libs.expand-library->sexp ?sexp))
where ?sexp is the library symbolic expression. For
example, expanding the library:
(library (ciao)
(export var fun mac etv)
(import (vicare))
(define var 1)
(define (fun)
2)
(define-syntax (mac stx)
3)
(define-syntax etv
(make-expand-time-value
(+ 4 5))))
yields the invoke-code:
(library-letrec*
((lex.var loc.lex.var '1)
(lex.fun loc.lex.fun (annotated-case-lambda fun (() '2))))
((primitive void)))
the visit-code:
(begin
(set! loc.lab.mac
(annotated-case-lambda
(#'lambda (#'stx) #'3)
((lex.stx) '3)))
(set! loc.lab.etv
(annotated-call
(make-expand-time-value (+ 4 5))
(primitive make-expand-time-value)
(annotated-call (+ 4 5) (primitive +) '4 '5))))
the export-subst:
((etv . lab.etv) (mac . lab.mac) (fun . lab.fun) (var . lab.var))
the global-env:
((lab.var global . loc.lex.var) (lab.fun global . loc.lex.fun) (lab.mac global-macro . loc.lab.mac) (lab.etv global-etv . loc.lab.etv))
Another example, for the library:
(library (ciao (1 2))
(export doit)
(import (vicare))
(stale-when (< 1 2)
(define a 123))
(stale-when (< 2 3)
(define b 123))
(define (doit)
123))
the guard-code is:
(if (if '#f
'#t
(annotated-call (< 1 2) (primitive <) '1 '2))
'#t
(annotated-call (< 2 3) (primitive <) '2 '3))
Next: libutils loading, Previous: libutils interning, Up: libutils [Index]