Ejemplo n.º 1
0
 def test_read_operator(self):
     self.assertEqual(
         Forms(ValueNode('_cons', specials.cons), IdentifierNode('a'),
               IdentifierNode('b')), read_one('a:b'))
     self.assertEqual(
         Forms(
             IdentifierNode('print'),
             Forms(ValueNode('_cons', specials.cons), IdentifierNode('a'),
                   IdentifierNode('b'))), read_one('(print a:b)'))
Ejemplo n.º 2
0
def cdr(arg, scope):
    assert type(arg) is Pair
    assert eval_node(arg.cdr, scope) is nil
    val = eval_node(arg.car, scope)
    return val.get(Pair(IdentifierNode('cdr'), nil), scope)
Ejemplo n.º 3
0
    def test_read_misc(self):
        self.assertEqual(
            FormNode(IdentifierNode('id'), Pair(NumericLiteralNode('1'), nil)),
            read_one('(id 1)'))
        self.assertEqual(
            FormNode(
                IdentifierNode('id'),
                Pair(NumericLiteralNode('1'), Pair(NumericLiteralNode('2'),
                                                   nil))),
            read_one('(id 1 2)'))
        self.assertEqual(Forms(IdentifierNode('id'), NumericLiteralNode('1')),
                         read_one('(id 1)'))
        self.assertEqual(
            Forms(
                IdentifierNode('id'),
                FormNode(
                    IdentifierNode('add'),
                    Pair(NumericLiteralNode('1'),
                         Pair(NumericLiteralNode('2'), nil)))),
            read_one('(id (add 1 2))'))
        self.assertEqual(
            Forms(
                IdentifierNode('id'),
                FormNode(
                    ValueNode('_list', specials.list_),
                    Pair(NumericLiteralNode('1'),
                         Pair(NumericLiteralNode('2'), nil)))),
            read_one('(id [1 2])'))
        self.assertEqual(
            Forms(
                IdentifierNode('id'),
                FormNode(
                    ValueNode('_list', specials.list_),
                    Pair(NumericLiteralNode('1'), NumericLiteralNode('2')))),
            read_one('(id [1 | 2])'))
        self.assertEqual(
            Forms(Forms(IdentifierNode('id'), IdentifierNode('id')),
                  NumericLiteralNode('1')), read_one('((id id) 1)'))

        self.assertEqual(
            Forms(
                IdentifierNode('print'),
                Forms(IdentifierNode('add'), NumericLiteralNode('5'),
                      NumericLiteralNode('6'))), read_one('(print (add 5 6))'))

        self.assertEqual(
            Forms(
                IdentifierNode('print'),
                FormNode(
                    ValueNode('_list', specials.list_),
                    Pair(NumericLiteralNode('7'), NumericLiteralNode('8')))),
            read_one('(print [7 | 8])'))

        self.assertEqual(
            Forms(
                IdentifierNode('print'),
                Forms(
                    ValueNode('_list', specials.list_),
                    Forms(IdentifierNode('add'), NumericLiteralNode('10'),
                          NumericLiteralNode('20'))),
            ), read_one('(print [(add 10 20)])'))
Ejemplo n.º 4
0
 def test_read_square_brackets_with_cdr_converts_to_list_special_form(self):
     self.assertEqual(
         FormNode(ValueNode('_list', specials.list_),
                  Pair(IdentifierNode('a'), IdentifierNode('b'))),
         read_one('[a | b]'))
Ejemplo n.º 5
0
 def test_read_form_without_cdr_implicit_nil(self):
     self.assertEqual(
         Forms(IdentifierNode('a'), IdentifierNode('b'), PAIR_CDR_TOKEN,
               nil), read_one('(a b)'))
Ejemplo n.º 6
0
 def test_read_form_without_cdr(self):
     self.assertEqual(Forms(IdentifierNode('a'), IdentifierNode('b')),
                      read_one('(a b)'))
Ejemplo n.º 7
0
 def test_read_form_with_form_as_cdr(self):
     self.assertEqual(
         FormNode(IdentifierNode('a'), FormNode(IdentifierNode('b'), nil)),
         read_one('(a | (b))'))
Ejemplo n.º 8
0
 def test_read_trivial_form(self):
     self.assertEqual(FormNode(IdentifierNode('a'), nil), read_one('(a)'))
Ejemplo n.º 9
0
 def test_read_bare_literals(self):
     self.assertEqual(IdentifierNode('a'), read_one('a'))
     self.assertEqual(NumericLiteralNode('10'), read_one('10'))
Ejemplo n.º 10
0
    def test_expand_binary_operators_precedence_and_associativity(self):
        specials_dict = {
            'get': specials.get,
            'cons': specials.cons,
            'list': specials.list_,
            'pattern-with-predicate': specials.pattern_with_predicate,
            'pattern-with-default': specials.pattern_with_default,
        }

        def special(name, *nodes):
            return Forms(ValueNode('_%s' % name, specials_dict[name]), *nodes)

        self.assertEqual(
            special(
                'cons', special('get', IdentifierNode('a'),
                                IdentifierNode('b')),
                special(
                    'cons',
                    special(
                        'get',
                        special('get', IdentifierNode('c'),
                                IdentifierNode('d')), IdentifierNode('e')),
                    IdentifierNode('f'))), read_one('a.b:c.d.e:f'))
        self.assertEqual(
            special('pattern-with-predicate',
                    special('cons', IdentifierNode('a'), IdentifierNode('b')),
                    IdentifierNode('even?')), read_one('a:b::even?'))
        self.assertEqual(
            special(
                'pattern-with-default',
                special(
                    'pattern-with-predicate',
                    special('cons', IdentifierNode('a'), IdentifierNode('b')),
                    IdentifierNode('even?')), IdentifierNode('c')),
            read_one('a:b::even? = c'))
        self.assertEqual(
            special(
                'pattern-with-default',
                special(
                    'pattern-with-predicate',
                    special(
                        'pattern-with-predicate',
                        special('cons', IdentifierNode('a'),
                                IdentifierNode('b')), IdentifierNode('even?')),
                    IdentifierNode('odd?')), IdentifierNode('c')),
            read_one('a:b::even?::odd? = c'))

        self.assertEqual(
            Forms(
                ValueNode('_list', specials.list_), IdentifierNode('a'),
                special('pattern-with-default', IdentifierNode('b'),
                        IdentifierNode('c'))), read_one('[a b = c]'))
Ejemplo n.º 11
0
 def test_expand_binary_operators(self):
     self.assertEqual(
         [
             Forms(ValueNode('_cons', specials.cons), IdentifierNode('a'),
                   IdentifierNode('b'))
         ],  # TODO: FIX. Honestly, I have no idea what I wantd to fix here. This looks right to me.
         expand_binary_operators([
             IdentifierNode('a'), BINARY_OPERATORS[':'],
             IdentifierNode('b')
         ]))
     self.assertEqual([
         IdentifierNode('x'),
         Forms(ValueNode('_cons', specials.cons), IdentifierNode('a'),
               IdentifierNode('b')),
         IdentifierNode('y')
     ],
                      expand_binary_operators([
                          IdentifierNode('x'),
                          IdentifierNode('a'), BINARY_OPERATORS[':'],
                          IdentifierNode('b'),
                          IdentifierNode('y')
                      ]))
     self.assertEqual([
         Forms(
             ValueNode('_cons', specials.cons), IdentifierNode('a'),
             Forms(ValueNode('_cons', specials.cons), IdentifierNode('b'),
                   IdentifierNode('c')))
     ],
                      expand_binary_operators([
                          IdentifierNode('a'), BINARY_OPERATORS[':'],
                          IdentifierNode('b'), BINARY_OPERATORS[':'],
                          IdentifierNode('c')
                      ]))
Ejemplo n.º 12
0
 def test_expand_unary_operators(self):
     self.assertEqual([
         IdentifierNode('a'),
         Forms(ValueNode('_id', specials.id), IdentifierNode('b'))
     ],
                      expand_unary_operators([
                          IdentifierNode('a'), UNARY_OPERATORS['~'],
                          IdentifierNode('b')
                      ]))
     self.assertEqual([
         IdentifierNode('a'),
         Forms(ValueNode('_id', specials.id),
               Forms(ValueNode('_id', specials.id), IdentifierNode('b')))
     ],
                      expand_unary_operators([
                          IdentifierNode('a'), UNARY_OPERATORS['~'],
                          UNARY_OPERATORS['~'],
                          IdentifierNode('b')
                      ]))
     self.assertEqual([
         IdentifierNode('a'),
         Forms(ValueNode('_get', specials.get), IdentifierNode('this'),
               IdentifierNode('b'))
     ],
                      expand_unary_operators([
                          IdentifierNode('a'), UNARY_OPERATORS['@'],
                          IdentifierNode('b')
                      ]))