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') ])) ]) ]))
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))
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))
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'):