예제 #1
0
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))))))
예제 #2
0
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)))
예제 #3
0
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)
예제 #4
0
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))))
예제 #5
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))
예제 #6
0
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))
예제 #7
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))
예제 #8
0
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)))
예제 #9
0
def getvalue(compiler, cont, item):
    if isinstance(item, Var) or isinstance(item, Cons):
        return cont(il.GetValue(item.interlang()))
    else:
        return cont(item.interlang())
예제 #10
0
def length(compiler, cont, sequence):
    return sequence.cps(
        compiler, il.clamda(sequence1, cont(il.Len(il.GetValue(sequence1)))))