[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Semantics of circular imports
From: |
Zhu Zihao |
Subject: |
Re: Semantics of circular imports |
Date: |
Mon, 28 Mar 2022 12:24:26 +0800 |
User-agent: |
mu4e 1.6.10; emacs 27.2 |
Philip McGrath <philip@philipmcgrath.com> 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
signature.asc
Description: PGP signature