Philip McGrath writes: > Oh, wow. I definitely had not realized that, *even inside a declarative > module*, a reference to a variable with no statically visible definition > would semantically be a dynamic lookup in a mutable environment at > runtime (rather than a compile-time error), though I do see now that > `info guile declarative` does indeed say that marking a module as > declarative "applies only to the subset of top-level definitions that > are themselves declarative: those that are defined within the > compilation unit, and not assigned (‘set!’) or redefined within the > compilation unit." It depends on how you reference to it. If a variable is referenced in the same module, it'll be inlined if it's small enough. If you reference it from another module, it'll do something like module-ref instead (works like non-declarative binding) > This seems like a big barrier to cross-module inlining, though IIUC Guile > currently doesn't do much of that by default (maybe for this reason). Guile 3.0.8 comes to rescue. It works by rewrite the `define-module` call and attach the tree-il of some bindings on it. For details, read the blog post authored by Andy Wingo https://wingolog.org/archives/2021/05/13/cross-module-inlining-in-guile TIPS: If you're interested in the implementation detail of Guile. You should not miss the Andy Wingo's blog post! > The use of "top-level" to refer to definitions within a module is > somewhat confusing to me. I usually understand "top-level" to refer to > the kind of interactive REPL environment for which R6RS leaves the > semantics unspecified. Racket uses "module-level variable" and "module > context" in contrast to "top-level variable" and "top-level context" to > make this distinction.[1][2][3] (There are also R6RS "top-level > programs", but I wouldn't think of those unless made very clear from > context.) Top-level is the set of outermost brackets in a file :) The optimization pass related to the top-level in Guile is called letrectify. It rewrites the top-level bindings into a big letrec block. You can check the comment of (language tree-il letrectify) and it has a good example. Because top-levels can reference each other, so the evaluation order will not the same as the code order. -- Retrieve my PGP public key: gpg --recv-keys D47A9C8B2AE3905B563D9135BE42B352A9F6821F Zihao