예제 #1
0
def unary_op_dispatch(op_id):
    return logic.FloatingChain(logic.Chain([
        logic.Link(logic.Paren, logic.Square, [logic.IndexedTerm(0,'x',logic.IDENTITY)]),
        logic.Reference('x'),
        logic.Link(logic.Angle, logic.Paren, [
            logic.IndexedTerm('type', 0, logic.Chain([
                logic.Link(logic.Curly, logic.Square, [
                    logic.IndexedTerm(op_id, 'op', logic.IDENTITY)]
                ),
                logic.Reference('x'),
                logic.Reference('op')
            ]))
        ])
    ]))
예제 #2
0
def unary_op(op_func, result_boxer, t):
    def f(x):
        if type_check(x, t):
            return result_boxer(op_func(x.content))
        return logic.HNONE
    return logic.FloatingChain(WrappedFunc(f))
예제 #3
0
def binary_op(op_func, result_boxer, t1, t2):
    def f(x):
        if arg_struct_type_check(x, t1, t2):
            return result_boxer(op_func(x.data[0].content, x.data[1].content))
        return logic.HNONE
    return logic.FloatingChain(WrappedFunc(f))
예제 #4
0
HTRUE.data['true'] = HUNIT
BUILTINS['true'] = HTRUE
HFALSE = logic.Struct({}, adjuncts={'type': BOOL_TYPE})
HFALSE.data['false'] = HUNIT
BUILTINS['false'] = HFALSE

def bool_box(x):
    return HTRUE if x else HFALSE

def bool_not(x):
    if x is HFALSE:
        return HTRUE
    if x is HTRUE:
        return HFALSE
    return logic.HNONE
BOOL_TYPE.data['!'] = logic.FloatingChain(WrappedFunc(bool_not))

def bool_and(x):
    if arg_struct_type_check(x, 'bool', 'bool'):
        return bool_box(x.data[0] == HTRUE and x.data[1] == HTRUE)
    return logic.HNONE
BOOL_TYPE.data['&'] = logic.FloatingChain(WrappedFunc(bool_and))

def bool_or(x):
    if arg_struct_type_check(x, 'bool', 'bool'):
        return bool_box(x.data[0] == HTRUE or x.data[1] == HTRUE)
    return logic.HNONE
BOOL_TYPE.data['|'] = logic.FloatingChain(WrappedFunc(bool_or))

def bool_eq(x):
    if arg_struct_type_check(x, 'bool', 'bool'):