def contain(compiler, cont, container, member): container1 = compiler.new_var(il.ConstLocalVar('container')) container2 = compiler.new_var(il.ConstLocalVar('container')) member1 = compiler.new_var(il.ConstLocalVar('member')) member2 = compiler.new_var(il.ConstLocalVar('member')) return container.cps( compiler, il.clamda( container1, il.Assign(container2, il.GetValue(container1)), member.cps( compiler, il.clamda( member1, il.Assign(member2, il.GetValue(member1)), il.If(il.In(member2, container2), cont(il.TRUE), il.failcont(il.FALSE))))))
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 seplist(compiler, cont, item, separator, template=None, result=None): if result is None: return begin(item, any1(begin(separator, item))).cps(compiler, cont) else: result1 = compiler.new_var(il.ConstLocalVar('result')) result2 = compiler.new_var(Var('result')) result2_2 = result2.interlang() template1 = template.interlang() return begin( item, direct_interlang(il.Assign(result1, il.GetValue(template1))), any2(begin(separator, item), template, result2), eval_unify( result, direct_interlang(il.add(il.MakeList(result1), result2_2)))).cps(compiler, cont)
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 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 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))
def getvalue_default(compiler, cont, item, default=None): if default is None: default = NONE v = compiler.new_var(il.ConstLocalVar('v')) return il.begin( il.Assign(v, il.GetValue(item.interlang())), il.If(il.IsLogicVar(v), default.cps(compiler, cont), cont(v)))
def getvalue(compiler, cont, item): if isinstance(item, Var) or isinstance(item, Cons): return cont(il.GetValue(item.interlang())) else: return cont(item.interlang())
def length(compiler, cont, sequence): return sequence.cps( compiler, il.clamda(sequence1, cont(il.Len(il.GetValue(sequence1)))))