コード例 #1
0
def encode_num(num):
    if not isinstance(num, int) or isinstance(num, bool) or not num >= 0:
        raise TypeError(num)
    result = lib.zero
    for i in xrange(num):
        result = lib.succ(result)
    return result
コード例 #2
0
     'encode_error': [None, 0, 1, 2, [None], [True]],
     'decode_error': [I, B, C, APP(C, B)],
 },
 'byte': {
     'ok': [
         (lib.byte_table[ord(b'a')], b'a'),
         (lib.byte_table[0x00], b'\x00'),
         (lib.byte_table[0xff], b'\xff'),
     ],
     'encode_error': [0, ['a'], 'asdf'],
     'decode_error': [I, K, B, C, APP(C, B)],
 },
 'num': {
     'ok': [
         (lib.zero, 0),
         (lib.succ(lib.zero), 1),
         (lib.succ(lib.succ(lib.zero)), 2),
         (lib.succ(lib.succ(lib.succ(lib.zero))), 3),
     ],
     'encode_error': [None, False, True, [0], [True]],
 },
 ('prod', 'bool', 'num'): {
     'ok': [
         (lib.pair(lib.true, lib.zero), (True, 0)),
         (lib.pair(lib.false, lib.succ(lib.succ(lib.zero))), (False, 2)),
     ],
     'encode_error': [None, (), (True,), [True, 0], True, 0, 'asdf']
 },
 ('sum', 'bool', 'num'): {
     'ok': [
         (lib.inl(lib.true), (True, True)),
コード例 #3
0

# ----------------------------------------------------------------------------
# Numerals as Y Maybe

def encode_num(num):
    if not isinstance(num, int) or isinstance(num, bool) or not num >= 0:
        raise TypeError(num)
    result = lib.zero
    for i in xrange(num):
        result = lib.succ(result)
    return result


_pred_var = unification.var('pred')
_succ_pattern = lib.succ(_pred_var)


def decode_num(code):
    result = 0
    while True:
        if code is lib.zero:
            return result
        match = unification.unify(_succ_pattern, code)
        if not match:
            raise TypeError(code)
        result += 1
        code = match[_pred_var]


# ----------------------------------------------------------------------------