dango.py
30分プログラム、その30。
リリカルLispにもでてきたリストをもとにした四則演算。ほかのところでも聞いたことある気がするけど、思いだせない。
>> import dango >> two = inc(inc(zero())) ['o', 'o'] >> three = inc(inc(inc(zero()))) ['o', 'o', 'o'] >> add(three,two) ['o', 'o', 'o', 'o', 'o'] >> mul(three,two) ['o', 'o', 'o', 'o', 'o', 'o']
といった感じに、リストの長さが整数値に対応している。
def zero(): return [] def inc(val): return ['o']+val def dec(val): return val[1:] def integer(val): return len(val) def add(x,y): if y == zero(): return x else: return add(inc(x),dec(y)) def sub(x,y): if y == zero(): return x else: return sub(dec(x),dec(y)) def mul(x,y): if y == zero(): return zero() else: return add(x,mul(x,dec(y))) def div(x,y): if x == zero(): return zero() else: return add(inc(zero()),div(sub(x,y),y)) def eq(x,y): if x == zero() and y == zero(): return True elif x == zero() or y == zero(): return False else: return eq(dec(x),dec(y)) def ge(x,y): if x == zero() and y == zero(): return False elif x == zero(): return True else: return ge(dec(x),dec(y)) def geq(x,y): return ge(x,y) or eq(x,y) def le(x,y): return not geq(x,y) def leq(x,y): return le(x,y) or eq(x,y)
- True/Falseじゃなくて、true/falseって書きたいな
- returnがめんどうだな
- zero()との比較が抽象化されてないみたいで嫌だな