unlambda失敗版

関数型言語の悪夢がやってくる

30分で何かをつくってみようシリーズ、その2。
id:selvaggioをまねしてunlmabdaを実装しようとして失敗しようとしたバージョン。dとcが実装できなかった。

テストプログラムを書くのに死ぬほど苦労した。もう二度と手を出さないぞ。

import sys
class StringArray:
    def __init__(self,str):
	self.str = str
	self.index = 0

    def eof(self):
	return self.index == len(self.str)

    def pop(self):
	i = self.index
	self.index += 1
	return self.str[i]

    def __str__(self):
	return self.str[self.index:]
    

def i(x):
    return x

def r(x):
    print ''
    return x

def v(x):
    return v

current_char = ''
def at(x):
    global current_char
    current_char = sys.stdin.read(1)
    if current_char == "\n":
	return x(v)
    else:
	return x(i)

def bar(x):
    global current_char
    sys.stdout.write(current_char)
    return x(i)

func = { 'i' : i,
	 'k' : (lambda x: (lambda y: x)),
	 's' : (lambda x: (lambda y: (lambda z: 
				      # ((x y) (y z))
				      x(z)(y(z))))),
	 'r': r,
	 '@': at,
	 'v' : v,
	 'e' : (lambda x:sys.exit()),
	 '|' : bar
	 }

def parse(str):
    global func
    x = str.pop()
    if x == "`":
	f = parse(str)
	arg = parse(str)
	return f(arg)
    elif x == '.':
	ch = str.pop();
	def dot(x):
	    sys.stdout.write(ch)
	    return x
	return dot
    elif x == '?':
	ch = str.pop()
	def check(f):
	    global current_char
	    if current_char == ch:
		return f(i)
	    else:
		return f(v)
	return check
    elif func.has_key(x):
	return func[x]

array = StringArray(sys.argv[1])
print parse(array)