def any2(compiler, cont, item, template, result): template = template.interlang() result = result.interlang() any_cont = compiler.new_var(il.ConstLocalVar('any_cont')) fc = compiler.new_var(il.ConstLocalVar('old_fail_cont')) v = compiler.new_var(il.ConstLocalVar('v')) v2 = compiler.new_var(il.ConstLocalVar('v')) v3 = compiler.new_var(il.ConstLocalVar('v')) return il.Begin( (il.Assign(result, il.empty_list), il.cfunction( any_cont, v, il.Assign(fc, il.failcont), il.SetFailCont( il.clamda( v, il.SetFailCont( il.clamda( v3, il.if2(result, il.DelListItem(result, il.Integer(-1))), fc(v3))), cont(v))), item.cps( compiler, il.clamda(v2, il.ListAppend(result, il.GetValue(template)), any_cont(v2))))(il.NONE)))
def or2_fun(compiler, cont, clause1, clause2): v = compiler.new_var(il.ConstLocalVar('v')) v1 = compiler.new_var(il.ConstLocalVar('v')) v2 = compiler.new_var(il.ConstLocalVar('v')) parse_state = compiler.new_var(il.ConstLocalVar('parse_state')) bindings = compiler.new_var(il.LocalVar('bindings')) fc = compiler.new_var(il.ConstLocalVar('old_failcont')) if has_cut_or(clause1) or has_cut_or(clause2): cut_or_cont = compiler.new_var(il.ConstLocalVar('cut_or_cont')) or_cont = il.clamda(v, il.SetCutOrCont(cut_or_cont), cont(v)) return il.begin( il.Assign(cut_or_cont, il.cut_or_cont), il.Assign(parse_state, il.parse_state), il.Assign(bindings, il.Copy(il.bindings)), il.Assign(fc, il.failcont), il.SetCutOrCont(il.clamda(v2, il.Assign(il.parse_state, parse_state), il.SetBindings(bindings), fc(il.FALSE))), il.SetFailCont(il.clamda(v1, il.SetFailCont(fc), clause2.cps(compiler, or_cont))), clause1.cps(compiler, or_cont)) else: return il.begin( il.Assign(fc, il.failcont), il.SetFailCont(il.clamda(v1, il.SetFailCont(fc), clause2.cps(compiler, cont))), clause1.cps(compiler, cont))
def any1(compiler, cont, item): any_cont = compiler.new_var(il.ConstLocalVar('any_cont')) fc = compiler.new_var(il.ConstLocalVar('old_fail_cont')) v = compiler.new_var(il.ConstLocalVar('v')) return il.cfunction( any_cont, v, il.Assign(fc, il.failcont), il.SetFailCont(il.clamda(v, il.SetFailCont(fc), cont(v))), item.cps(compiler, any_cont))(il.TRUE)
def some1(compiler, cont, item): some_cont = compiler.new_var(il.ConstLocalVar('some_cont')) fc = compiler.new_var(il.ConstLocalVar('old_fail_cont')) v = compiler.new_var(il.ConstLocalVar('v')) some_cont = il.cfunction( some_cont, v, il.Assign(fc, il.failcont), il.SetFailCont(il.clamda(v, il.SetFailCont(fc), cont(v))), item.cps(compiler, some_cont)) return item.cps(compiler, some_cont)
def greedy_any1(compiler, cont, item): v = compiler.new_var(il.ConstLocalVar('v')) fc = compiler.new_var(il.ConstLocalVar('old_failcont')) greedy_any_fcont = compiler.new_var(il.ConstLocalVar('greedy_any_fcont')) greedy_any_cont = compiler.new_var(il.ConstLocalVar('greedy_any_cont')) return il.begin( il.Assign(fc, il.failcont), il.cfunction(greedy_any_fcont, v, il.SetFailCont(fc), cont(il.TRUE)), il.cfunction(greedy_any_cont, v, il.SetFailCont(greedy_any_fcont), item.cps(compiler, greedy_any_cont))(il.TRUE))
def lazy_any1(compiler, cont, item): fc = compiler.new_var(il.ConstLocalVar('fc')) lazy_any_cont = compiler.new_var(il.ConstLocalVar('lazy_any_cont')) lazy_any_fcont = compiler.new_var(il.ConstLocalVar('lazy_any_fcont')) v = compiler.new_var(il.ConstLocalVar('v')) return il.begin( il.Assign(fc, il.failcont), il.cfunction(lazy_any_fcont, v, il.SetFailCont(fc), item.cps(compiler, lazy_any_cont)), il.cfunction(lazy_any_cont, v, il.SetFailCont(lazy_any_fcont), cont(il.TRUE))(il.TRUE))
def findall_1(compiler, cont, goal): v = compiler.new_var(il.ConstLocalVar('v')) v2 = compiler.new_var(il.ConstLocalVar('v')) fc = compiler.new_var(il.ConstLocalVar('old_failcont')) return il.begin( il.Assign(fc, il.failcont), il.SetFailCont(il.clamda(v2, il.SetFailCont(fc), cont(v2))), goal.cps(compiler, il.Clamda(v, il.failcont(v))) )
def repeat(compiler, cont): v = compiler.new_var(il.ConstLocalVar('v')) function = compiler.new_var(il.ConstLocalVar('function')) return il.begin(il.cfunction(function, v, cont(v)), il.PrintLn(il.String('repeat')), il.SetFailCont(function), function(NONE))
def findall_2(compiler, cont, goal, template, bag): v = compiler.new_var(il.ConstLocalVar('v')) v2 = compiler.new_var(il.ConstLocalVar('v')) fc = compiler.new_var(il.ConstLocalVar('old_failcont')) bag = bag.interlang() template = template.interlang() return il.begin( il.Assign(bag, il.empty_list), il.Assign(fc, il.failcont), il.SetFailCont(il.clamda(v2, il.SetFailCont(fc), cont(v2))), goal.cps(compiler, il.clamda(v, il.ListAppend(bag, il.GetValue(template)), il.failcont(v))))
def once(compiler, cont, exp): v = compiler.new_var(il.ConstLocalVar('v')) fc = compiler.new_var(il.ConstLocalVar('fc')) return il.begin( il.Assign(fc, il.failcont), exp.cps(compiler, il.clamda(v, il.SetFailCont(fc), cont(v))))
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)
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))))) ))))
def first_(compiler, cont, clause1, clause2): v = compiler.new_var(il.ConstLocalVar('v')) fc = compiler.new_var(il.ConstLocalVar('fc')) first_cont = il.clamda(v, il.SetFailCont(fc), cont(v)) return il.begin( il.Assign(fc, il.failcont), il.append_failcont(compiler, clause2.cps(compiler, first_cont)), clause1.cps(compiler, first_cont))
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))
def lazy_any2(compiler, cont, item, template, result): template = template.interlang() result = result.interlang() fc = compiler.new_var(il.ConstLocalVar('fc')) lazy_any_cont = compiler.new_var(il.ConstLocalVar('lazy_any_cont')) lazy_any_fcont = compiler.new_var(il.ConstLocalVar('lazy_any_fcont')) v = compiler.new_var(il.ConstLocalVar('v')) v1 = compiler.new_var(il.ConstLocalVar('v')) v2 = compiler.new_var(il.ConstLocalVar('v')) return il.begin( il.Assign(result, il.empty_list), il.Assign(fc, il.failcont), il.cfunction( lazy_any_fcont, v, il.SetFailCont(fc), item.cps( compiler, il.clamda(v2, il.ListAppend(result, il.GetValue(template)), lazy_any_cont(il.TRUE)))), il.cfunction(lazy_any_cont, v, il.SetFailCont(lazy_any_fcont), cont(il.TRUE))(il.TRUE))
def wrap_cut(compiler, cont, exp): cut_cont = il.ConstLocalVar('cut_cont') v = il.ConstLocalVar('v') v1 = compiler.new_var(il.ConstLocalVar('v')) v2 = compiler.new_var(il.ConstLocalVar('v')) parse_state = compiler.new_var(il.ConstLocalVar('parse_state')) bindings = compiler.new_var(il.LocalVar('bindings')) fc = compiler.new_var(il.ConstLocalVar('old_failcont')) return il.begin( il.Assign(cut_cont, il.cut_cont), il.Assign(parse_state, il.parse_state), il.Assign(bindings, il.Copy(il.bindings)), il.Assign(fc, il.failcont), il.SetCutCont(il.clamda(v2, il.Assign(il.parse_state, parse_state), il.SetBindings(bindings), fc(il.FALSE))), il.SetFailCont(il.clamda(v1, il.SetFailCont(fc), il.Assign(il.cut_cont, cut_cont), fc(il.FALSE))), exp.cps(compiler, il.clamda(v, il.Assign(il.cut_cont, cut_cont), cont(v))))
def notunify(compiler, cont, x, y): v = compiler.new_var(il.ConstLocalVar('v')) cont1 = il.clamda(v, il.failcont(il.FALSE)) cont2 = il.clamda(v, cont(il.TRUE)) return il.begin(il.SetFailCont(cont2), cps_convert_unify(x, y, compiler, cont1))
def not_p(compiler, cont, clause): fc = compiler.new_var(il.ConstLocalVar('old_fail_cont')) return il.begin(il.Assign(fc, il.failcont), il.SetFailCont(cont), clause.cps(compiler, fc))
def cut_or(compiler, cont): return il.begin(il.SetFailCont(il.cut_or_cont), cont(NONE))