Next: , Previous: , Up: expander examples   [Index]


15.8.2 The top–level lexical environment

The syntactic bindings established by the import clause of programs and libraries are stored in a rib object; this rib represents the top–level environment and it is referred to as top–level rib. The descriptors of top–level syntactic bindings are stored in the value field of their label gensyms.

We can look at a syntactic identifier as follows:

(begin-for-syntax
  (pretty-print #'display))
-| #<syntactic-identifier expr=display mark*=(src)>

we see that: the source–name symbol is ‘display’; the list of marks is ‘(src)’; the list of rib objects is not displayed, because it is too long. We can inspect the list of rib objects too:

(begin-for-syntax
  (pretty-print (xp::stx-rib* #'display)))
-| (#<rib name*=(...) mark**=(...) label*=(...) sealed/freq=#f>)

we do not show the full output, because it is really long: the list of ribs contains a single item being the top–level rib of the program; this top rib contains a tuple for every syntactic binding imported in the program.

We can retrieve the elements of syntactic bindings from the top rib:

(begin-for-syntax
  (pretty-print (id->label #'display)))
-| lab.display

(begin-for-syntax
  (pretty-print (id->descriptor #'display)))
-| (core-prim . display)

If we define a lexical variable at the top–level of the program, we can then query its syntactic binding:

(define A 1)

(begin-for-syntax
  (pretty-print (id->label      #'A))
  (pretty-print (id->descriptor #'A)))
-| lab.A
-| (lexical . (lex.A . #f))

In the following examples: we avoid defining top–level bindings because printing the top rib is annoying; for this reason we use the function id-rib*/no-top which cuts out the top rib from a list of rib objects (the top rib is always the last item in a list of ribs).


Next: , Previous: , Up: expander examples   [Index]