Scheme通勤

nishiohirokazu2008-01-22

>>> 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)