trueagi-io/hyperon-experimental

parse grounded operation is badly implemented

Closed this issue · 5 comments

The code is

parseAtom = OperationAtom('parse', lambda s: [ValueAtom(SExprParser(str(s)[1:-1]).parse(Tokenizer()))],
                              ['String', 'Atom'], unwrap=False)

Apparently, the result of parse should not be wrapped into ValueAtom. Also, instead of a default tokenizer, the actual tokenizer from the runner might be more preferable. It would also be nice to add unit tests in test_stdlib.py

Okay, so after removing ValueAtom this is what I'm getting after pytest ./tests

platform linux -- Python 3.11.8, pytest-7.3.2, pluggy-1.4.0
rootdir: /home/daddywesker/Metta/dw_fork/hyperon-experimental/python
collected 93 items                                                                                                                                   

tests/test_atom.py ...........................                                                                                                 [ 29%]
tests/test_atom_type.py ...                                                                                                                    [ 32%]
tests/test_bindings.py .......                                                                                                                 [ 39%]
tests/test_custom_space.py .......                                                                                                             [ 47%]
tests/test_environment.py .                                                                                                                    [ 48%]
tests/test_examples.py ........s.                                                                                                              [ 59%]
tests/test_extend.py .....                                                                                                                     [ 64%]
tests/test_grounded_type.py ...s                                                                                                               [ 68%]
tests/test_grounding_space.py .......                                                                                                          [ 76%]
tests/test_load.py .                                                                                                                           [ 77%]
tests/test_metta.py .....                                                                                                                      [ 82%]
tests/test_minecraft.py ..                                                                                                                     [ 84%]
tests/test_minelogy.py ..                                                                                                                      [ 87%]
tests/test_modules.py .                                                                                                                        [ 88%]
tests/test_pln_tv.py .                                                                                                                         [ 89%]
tests/test_run_metta.py .....                                                                                                                  [ 94%]
tests/test_sexparser.py ..                                                                                                                     [ 96%]
tests/test_stdlib.py ..F                                                                                                                       [100%]

====================================================================== FAILURES ======================================================================
______________________________________________________________ StdlibTest.test_text_ops ______________________________________________________________

self = <test_stdlib.StdlibTest testMethod=test_text_ops>

    def test_text_ops(self):
        metta = MeTTa(env_builder=Environment.test_env())
        # Check that (repr (my atom)) == "(my atom)"
        self.assertEqualMettaRunnerResults(metta.run("!(repr (my atom))"),
                                           [[ValueAtom("(my atom)")]])
    
        # Check that (parse "(my atom)") == (my atom)
>       self.assertEqualMettaRunnerResults(metta.run("!(parse \"(my atom)\")"),
                                           [[ValueAtom(E(S("my"), S("atom")))]])

/home/daddywesker/Metta/dw_fork/hyperon-experimental/python/tests/test_stdlib.py:15: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/home/daddywesker/Metta/dw_fork/hyperon-experimental/python/tests/test_common.py:54: in assertEqualMettaRunnerResults
    self.assertTrue(areEqualMettaRunResults(left, right),
E   AssertionError: False is not true : MeTTa results differ: [[(my atom)]] != [[(my atom)]]
============================================================== short test summary info ===============================================================
FAILED tests/test_stdlib.py::StdlibTest::test_text_ops - AssertionError: False is not true : MeTTa results differ: [[(my atom)]] != [[(my atom)]]
====================================================== 1 failed, 90 passed, 2 skipped in 2.80s =======================================================

In my opinion, it is related to #654 Though maybe I'm wrong.

Replacing Tokenizer() with run_context.tokenizer() works fine on its own, of course with following this strings:

@register_atoms(pass_metta=True)
def text_ops(run_context):
   ...

Another question is - what kind of unittests should I add to test_stdlib?

Obviously, this test expects the result of parsing to be wrapped into ValueAtom, which is just wrong, so these unit tests should be fixes together with fixing implementation of parse. As for unit tests, we can keep them in test_text_ops (no need to move them to test_stdlib). But I'd add more tests for parsing, e.g. including grounded atoms (e.g., parsing (A 2 "S")), nested expressions, maybe something additionally

fixes together with fixing implementation of parse

Yes, my bad. It is done.

Complete by #658