Scheme通勤
>>> ConsList([]) () >>> ConsList([1]) (1 . ()) >>> ConsList([1, 2]) (1 . (2 . ())) >>> ConsList([1, 2, ".", 3]) (1 . (2 . 3)) >>> ConsList([1, [10, 20], ".", 3]) (1 . ((10 . (20 . ())) . 3))
ここまでできた。
(1 . (2 . ()))を(1 2)って表示する側はまだできてない。再帰呼び出しで素直に書く方法があるのかなぁ。
class Pair(object): def __init__(self, car, cdr): self.car = car self.cdr = cdr def __repr__(self): return "(%s . %s)" % (self.car, self.cdr) class NULL(object): def __repr__(self): return "()" NULL = NULL() class ConsList(object): def __init__(self, xs=[]): if len(xs) == 0: self.v = NULL else: if isinstance(xs[0], list): xs[0] = ConsList(xs[0]) if len(xs) == 3 and xs[1] == ".": self.v = Pair(xs[0], xs[2]) elif len(xs) == 1: self.v = Pair(xs[0], NULL) else: self.v = Pair(xs[0], ConsList(xs[1:])) def setv(self, v): self.v = v return self def __repr__(self): return str(self.v)