def test_parse_type(self): self.assertEqual(Parser.parse_type("Num"), NumType()) self.assertEqual(Parser.parse_type("Str"), StringType()) self.assertEqual(Parser.parse_type("Bool"), BoolType()) self.assertEqual(Parser.parse_type("Void"), UnitType()) self.assertEqual(Parser.parse_type("Dyn"), DynamicType()) self.assertEqual(Parser.parse_type(["Num", "->", "Num"]), FunType([NumType()], NumType())) self.assertEqual(Parser.parse_type(["->", "Void"]), FunType([], UnitType())) self.assertEqual( Parser.parse_type([["Str", "->", "Str"], "->", "Num"]), FunType([FunType([StringType()], StringType())], NumType()), )
def add_primitives(self, bindings): return self.update( { k: Primitive( k, p[0], Parser.parse_type(Parser.string_to_sexpr(p[1])), self ) for k, p in bindings.items() } )
def test_environment(self): runtime = Monito() bindings = { 'x': 4, 'hola': Monito.run('(max (list 1 3 2))'), '+': Primitive( '+', lambda x, y: x * y, Parser.parse_type(Parser.string_to_sexpr('Num Num -> Num')), runtime.environment ) } new_env = runtime.environment.new_environment(bindings) self.assertEqual(Monito.run('(- 3 x)', new_env), -1) self.assertEqual(Monito.run('(- 10 hola)', new_env), 7) self.assertEqual(Monito.run('(+ 2 3)', new_env), 6)