Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
@spy16 (cc @liefj)
This PR is a first attempt at implementing namespaces. I've only done cursory testing because I wanted to get feedback as early as possible.
The high-level strategy is for the
NamespaceExpr
to return a special error calledNamespaceInterrupt
, which contains a pointer to the new global namespace. TheEvaluator
catchesNamespaceInterrupt
and assigns the new env to itself.On the env side of things, you will note significant changes to the
core.Env
interface. From a semantic perspective, one creates new interfaces using a persistent interface embodied bycore.Env.WithNamespace
. This has been implemented by splittingmapEnv
intobuiltin.Env
andbuiltin.childEnv
. Thebuiltin.Env
type is responsible for managing namespaces, and children are bound to the namespace of their parents. Because the global scope ofbuiltin.Env
never changes, everything stays nice and consistent --childEnv
s will always see the same parent-namespace, even acrossNamespaceInterrupt
s.Please let me know your thoughts! @spy16 If you feel this is mergeable, let me know, and I'll do so after writing a few more tests.
⏱️ Estimated review time: 1h.
❌ WIP. Do not merge.