예제 #1
0
 def test_letrec(self):
     f, k, function = il.Var('f'), il.Var('k'), il.Var('function')
     result = cps(letrec([(f, lamda((), f()))], f()))
     expect = il.Clamda(v, il.Assign(f, v), v)(il.Lamda(
         (k, ),
         il.Clamda(function, function(k))(f)))
     eq_(result, expect)
예제 #2
0
 def test_findall2(self):
     cut_or_cont = il.Var('cut_or_cont')
     x, y = Var('x'), Var('y')
     findall_result = il.Var('findall_result')
     result = cps(findall(or_(1, 2), x, y))
     expect = 1
     eq_(result, expect)
예제 #3
0
 def test_function2(self):
     x = il.Var('x')
     f = il.Var('f')
     result = optimize(
         il.Begin((il.Assign(f, il.Lamda(
             (x, ), f(il.Integer(1)))), il.Apply(f, (il.Integer(3), )))))
     expect = il.Begin((il.Assign(f, il.Lamda(
         (x, ), f(il.Integer(1)))), il.Apply(f, (il.Integer(3), ))))
     eq_(result, expect)
예제 #4
0
 def test_function(self):
     x = il.Var('x')
     f = il.Var('f')
     result = optimize(
         il.Apply(
             il.Function(
                 f, (x, ),
                 il.If(il.Eq(x, il.Integer(1)), il.Integer(1),
                       f(il.sub(x, il.Integer(1))))), (il.Integer(3), )))
     expect = f(il.Integer(2))
     eq_(result, expect)
예제 #5
0
 def test_if_assign1(self):
     x = il.Var('x')
     y = il.Var('y')
     exp = il.begin(il.Assign(x, il.Integer(1)),
                    il.if_(y, il.Assign(x, il.Integer(2)), x))
     result = optimize(exp)
     expect = il.begin(il.Assign(x, il.Integer(1)),
                       il.if_(y, il.Assign(x, il.Integer(2)), 1))
     eq_(result, expect)
     eq_(result.statements[0]._removed, il.unknown)
     eq_(result.statements[0].removed(), True)
예제 #6
0
 def test_if_assign5(self):
     x = il.Var('x')
     y = il.Var('y')
     exp = il.begin(
         il.Assign(x, il.Integer(1)),
         il.if_(y, il.Assign(x, il.Integer(2)), il.Assign(x,
                                                          il.Integer(3))),
         il.Prin(x))
     result = optimize(exp)
     expect = exp
     eq_(result, expect)
     eq_(result.statements[0].removed(), True)
     eq_(result.statements[1].then.removed(), False)
예제 #7
0
 def test_repeat(self):
     function = il.Var('function')
     result = cps(repeat)
     expect = il.begin(il.SetFailCont(function),
                       il.CFunction(function, v,
                                    done()(v)))
     eq_(result, expect)
예제 #8
0
파일: arith.py 프로젝트: hermetique/dao
def between(compiler, cont, lower, upper, mid):
  lower1 = compiler.new_var(il.ConstLocalVar('lower'))
  upper1 = compiler.new_var(il.ConstLocalVar('upper'))
  mid1 = compiler.new_var(il.ConstLocalVar('mid'))
  fc = compiler.new_var(il.ConstLocalVar('fc'))
  i = compiler.new_var(il.Var('i'))
  v = compiler.new_var(il.ConstLocalVar('v'))
  return lower.cps(compiler, il.clamda(lower1,
    upper.cps(compiler, il.clamda(upper1,
    mid.cps(compiler, il.clamda(mid1,
        il.If(il.IsLogicVar(mid1),
          il.begin(
            il.Assign(i, lower1),
            il.Assign(fc, il.failcont),
            il.SetFailCont(il.clamda(v, 
              il.If(il.Eq(i, upper1),
                il.Begin((
                  il.Assign(il.failcont, fc),
                  fc(il.FALSE))),
                il.Begin((
                  il.AddAssign(i, il.Integer(1)),
                  il.SetBinding(mid1, i),
                  cont(il.TRUE)))))),                
            il.SetBinding(mid1, lower1),
            cont(il.TRUE)),
          il.If(il.Cle(lower1, mid1, upper1),
            cont(il.TRUE),
            il.failcont(il.FALSE)))))
    ))))    
예제 #9
0
 def test_assign2(self):
     x = il.Var('x')
     exp = il.begin(il.Assign(x, il.Integer(1)),
                    il.Assign(x, il.Integer(2)))
     result = optimize(exp)
     expect = exp
     eq_(result, expect)
     eq_(result.statements[0]._removed, True)
     eq_(result.statements[0].removed(), True)
예제 #10
0
def greedy_some2(compiler, cont, item, template, result):
    template = template.interlang()
    result = result.interlang()
    item_matched = compiler.new_var(il.Var('item_matched'))
    v = compiler.new_var(il.ConstLocalVar('v'))
    v2 = compiler.new_var(il.ConstLocalVar('v'))
    fc = compiler.new_var(il.ConstLocalVar('old_failcont'))
    greedy_some_fcont = compiler.new_var(il.ConstLocalVar('greedy_some_fcont'))
    greedy_some_cont = compiler.new_var(il.ConstLocalVar('greedy_some_cont'))
    append_result_cont = il.clamda(
        v2, il.ListAppend(result, il.GetValue(template)),
        greedy_some_cont(il.TRUE))
    return il.begin(
        il.Assign(result, il.empty_list), il.Assign(fc, il.failcont),
        il.cfunction(greedy_some_fcont, v, il.SetFailCont(fc), cont(il.TRUE)),
        il.cfunction(greedy_some_cont, v, il.SetFailCont(greedy_some_fcont),
                     item.cps(compiler, append_result_cont)),
        item.cps(compiler, append_result_cont))
예제 #11
0
def times1(compiler, cont, item, expect_times):
    expect_times = expect_times.interlang()
    i = compiler.new_var(il.Var('i'))
    times_cont = compiler.new_var(il.ConstLocalVar('times_cont'))
    v = compiler.new_var(il.ConstLocalVar('v'))
    return il.begin(
        il.Assert(
            il.And(il.Isinstance(expect_times, il.Int),
                   il.Gt(expect_times, il.Integer(0)))),
        il.Assign(i, il.Integer(0)),
        il.cfunction(
            times_cont, v,
            item.cps(
                compiler,
                il.clamda(
                    v, il.AddAssign(i, il.Integer(1)),
                    il.If(il.Eq(i, expect_times), cont(v),
                          times_cont(il.TRUE)))))(il.TRUE))
예제 #12
0
def times2(compiler, cont, item, expect_times, template, result):
    expect_times = expect_times.interlang()
    template = template.interlang()
    result = result.interlang()
    i = compiler.new_var(il.Var('i'))
    times_cont = compiler.new_var(il.ConstLocalVar('times_cont'))
    v = compiler.new_var(il.ConstLocalVar('v'))
    return il.begin(
        il.Assert(
            il.And(il.Isinstance(expect_times, il.Int),
                   il.Gt(expect_times, il.Integer(0)))),
        il.Assign(result, il.empty_list), il.Assign(i, il.Integer(0)),
        il.cfunction(
            times_cont, v,
            item.cps(
                compiler,
                il.clamda(
                    v, il.AddAssign(i, il.Integer(1)),
                    il.ListAppend(result, il.GetValue(template)),
                    il.If(il.Eq(i, expect_times), cont(v),
                          times_cont(il.TRUE)))))(il.TRUE))
예제 #13
0
 def test_any(self):
     any_cont = il.Var('any_cont')
     result = cps(any(1, nongreedy))
     expect = 1
     eq_(result, expect)
예제 #14
0
 def test_char2(self):
     x = Var('x')
     text, pos = il.Var('text'), il.Var('pos')
     result = cps(char(x))
     expect = 2
     eq_(result, expect)
예제 #15
0
 def test_char(self):
     text, pos = il.Var('text'), il.Var('pos')
     result = cps(char('a'))
     expect = 1
     eq_(result, expect)
예제 #16
0
 def test_eoi(self):
     x = il.Var('x')
     result = cps(eoi)
     expect = 1
     eq_(result, expect)
예제 #17
0
 def test_if_3(self):
     x = il.Var('x')
     result = optimize(il.if_(x, il.if_(x, 2, 3), il.if_(x, 4, 5)))
     expect = il.if_(x, 2, 5)
     eq_(result, expect)
예제 #18
0
 def test_assign1(self):
     x = il.Var('x')
     result = optimize(il.Assign(x, il.Integer(1)))
     expect = il.Assign(x, il.Integer(1))
     eq_(result, expect)
예제 #19
0
# -*- coding: utf-8 -*-

from nose.tools import eq_, ok_, assert_raises

import dao
from dao.compilebase import Compiler, Environment, VariableNotBound
from dao.builtins import begin, quote, assign, if_, let, letrec
from dao.builtins import add
from dao.builtins import fail, succeed, or_, unify, repeat, any, nongreedy, LogicVar
from dao.builtins import lamda, add
from dao.command import Var

from dao import interlang as il

v, fc = il.Var('v'), il.Var('fc')
a0, a1, a2, a3, a4 = tuple(il.Var('a' + repr(i)) for i in range(5))


class Done(il.Clamda):
    def __repr__(self):
        return 'done()'


def done():
    return Done(v, v)


def cps(exp):
    return il.element(exp).cps(Compiler(), done())

예제 #20
0
 def interlang(self):
   return il.Var(self.name)
예제 #21
0
 def test_or(self):
     cut_or_cont = il.Var('cut_or_cont')
     result = cps(or_(1, 2))
     expect = 1
     eq_(result, expect)
예제 #22
0
 def test_simple(self):
     eq_(generate_code(1), '1')
     eq_(generate_code(il.Var('a')), 'a')
     eq_(generate_code('a'), "'a'")
     eq_(generate_code(il.Assign(v, il.Integer(1))), "v = 1")
     eq_(generate_code(il.add(v, il.Integer(1))), "(v)+(1)")
예제 #23
0
 def test_lambda_apply2(self):
     v1 = il.Var('v1')
     result = optimize(il.Clamda(v1, v1)(v))
     expect = v
     eq_(result, expect)
예제 #24
0
 def test_any2(self):
     text, pos = il.Var('text'), il.Var('pos')
     any_cont = il.Var('any_cont')
     result = cps(any(char('1')))
     expect = 1
     eq_(result, expect)
예제 #25
0
 def test_let(self):
     x, y, k = il.Var('x'), il.Var('y'), il.Var('k')
     result = cps(let(((x, 1), ), x))
     expect = il.Clamda(x, done()(x))(1)
     eq_(result, expect)
예제 #26
0
 def test_lambda(self):
     x, y, k = Var('x'), Var('y'), il.Var('k')
     result = cps(lamda((x, y), 1))
     expect = done()(lamda((x, y, k), k(1)))
     eq_(result, expect)
예제 #27
0
 def test_if_2(self):
     x = il.Var('x')
     result = optimize(il.if_(x, 2, il.if_(x, 3, 4)))
     expect = il.if_(x, 2, 4)
     eq_(result, expect)
예제 #28
0
 def test_unify3(self):
     x = il.Var('x')
     result = cps(unify(x, 2))
     expect = 1
     eq_(result, expect)
예제 #29
0
 def test_or(self):
     cut_or_cont = il.Var('cut_or_cont')
     v1 = il.Var('v1')
     result = compile_optimize(or_(1, 2))
     expect = 1
     eq_(result, expect)