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)