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()との比較が抽象化されてないみたいで嫌だな