trueagi-io/hyperon-experimental

MeTTa definitions of stdlib don't work in modules imported by import! function

vsbogd opened this issue · 2 comments

Code which uses MeTTa definitions of stdlib inside a module imported using import! doesn't work:

Steps to reproduce
imported.metta:

!(if True (println! imported-ok) (println! imported-nok))

import.metta:

!(import! &m imported.metta)

!(if True (println! self-ok) (println! self-nok))

Run import.metta

Expected result

metta import.metta
imported-ok
self-ok
[()]
[()]

Actual result

imported-ok
imported-nok
self-ok
[()]
[()]

Root cause
Metta::new_loading_runner creates an empty space but doesn't import stdlib into it while it gets all standard tokens. Thus all MeTTa definitions of the stdlib are not available for the interpreted code. It affects minimal MeTTa even more serious because interpreter itself is also part of the MeTTa stdlib code.

fn new_loading_runner(metta: &Metta, path: &Path) -> Self {
let space = DynSpace::new(GroundingSpace::new());
let tokenizer = metta.tokenizer().clone_inner();
let environment = metta.0.environment.clone();
let settings = metta.0.settings.clone();
let modules = metta.0.modules.clone();
//Start search for sub-modules in the parent directory of the module we're loading
let working_dir = path.parent().map(|path| path.into());
let metta = Self(Rc::new(MettaContents { space, tokenizer, settings, modules, environment, working_dir }));
register_runner_tokens(&metta);
metta
}

This should be fixed during work on #470

It is a blocker for minimal MeTTa work.

Fixed in #574