Skip to content

Conversation

@ssoelvsten
Copy link
Collaborator

@ssoelvsten ssoelvsten commented Nov 17, 2025

Replaces library import system with something that matches what we intend for the nomadic modules later.

This only applies to the standard library in the 'lib/' folder. While this also adds the require keyword to the compiler, the runtime ignores it. All in all, this creates the foundation on which we can begin implementing the nomadic modules. For now, this only really constitutes a cleanup of the compiler ( #79 ), the runtime ( #80 ), and the standard library ( #91 ). But, this does already fix #55 .

This pull request requires that the pull requests #79, #80, and #91 have all been merged.

This brings the name closer to the actual meaning of this construction.
This way, is is less likely one by accident exports the wrong
function under a different name
This frees '-l' up to be used for a '--link' later
These are (a) only used by the runtime and/or (b) only used seldomly.
Hence, we may as well open up for these to be used for something
different, e.g. modules
This is the only place it is used. Furthermore, having it defined in IR
removes it from the context of having to make it be valid JSON; anything
that is deemed 'prettier' might by accident be "re"used
There seems to be some unecessary complexity as a leftover of previous
designs?
This much better conveys the meaning of this argument, especially from the call site
This allows us later to store an initialised module. For now, it cleans up the scheduler
by decreasing the number of responsibilities.
The compiler is extended with two flags:
- [-m] compile a troupe program as a Module. This outputs the IR
       and also its (SHA256) hash.
- [-i] Include directory for modules. This is needed to find the
       hash value of any module that was required.

During the frontend, the modules are mainly passed along at the
program level without further treatment.

At the IR level and beyond (backend), the module dependencies are
moved from the program level to the function definitions. Since
functions can be sent independently to others, this allows the
different functions to keep track of their respective dependencies.
So, when a function is sent from one user to another, even though
the entire program depends on some module, the other user is only
told about it if there truly is a dependency.
This only applies to the standard library in the 'lib/' folder;
user-defined libraries that are opened via the `require` instead of
`import` statement are ignored.

What this does provide is a clean-up of the previous hacky library
system. Doing so, we fix the inability to compute constants as part of
library initialisation (issue TroupeLang#55).

This provides the foundation for us to build the nomadic module
system.
@ssoelvsten ssoelvsten added this to the Modules milestone Nov 17, 2025
@ssoelvsten ssoelvsten added ✨ enhancement New feature or request 📁 ./compiler Changes, errors, and additions for the compiler 📁 ./rt Changes and additions to the runtime ✨ code quality Uncle Bob would be proud labels Nov 17, 2025
@ssoelvsten ssoelvsten marked this pull request as draft November 17, 2025 13:17
@ssoelvsten ssoelvsten linked an issue Nov 17, 2025 that may be closed by this pull request
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ code quality Uncle Bob would be proud 📁 ./compiler Changes, errors, and additions for the compiler ✨ enhancement New feature or request 📁 ./rt Changes and additions to the runtime

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Library cannot use named functions for values

2 participants