예제 #1
0
    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()),
        )
예제 #2
0
 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()
         }
     )
예제 #3
0
    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)