Changeset 5400

Show
Ignore:
Timestamp:
01/24/08 13:49:27 (7 years ago)
Author:
nishio
Message:

lang/python/scheme/impl_0: cons listに変更

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/python/scheme/impl0/scheme.py

    r5266 r5400  
    3737        self.car = car 
    3838        self.cdr = cdr 
     39 
     40    @staticmethod         
     41    def from_list(xs): 
     42        if len(xs) == 0: 
     43            self = NULL 
     44        else: 
     45            car = xs[0] 
     46            if isinstance(car, list): 
     47                car = Pair.from_list(car) 
     48                 
     49            if len(xs) == 3 and xs[1] == ".": 
     50                self = Pair(car, xs[2]) 
     51            elif len(xs) == 1: 
     52                self = Pair(car, NULL) 
     53            else: 
     54                self = Pair(car, Pair.from_list(xs[1:])) 
     55 
     56        return self 
     57         
    3958    def __repr__(self): 
    4059        return "(%s . %s)" % (self.car, self.cdr) 
     60 
     61    def __iter__(self): 
     62        c = self 
     63        while c != NULL: 
     64            yield c.car 
     65            c = c.cdr 
     66 
     67    def __getattr__(self, name): 
     68        if re.match("c[ad]+r", name): 
     69            v = self 
     70            for c in name[1:-1]: 
     71                if c == "d": 
     72                    v = v.cdr 
     73                elif c == "a": 
     74                    v = v.car 
     75            return v 
     76        raise RuntimeError(name + " not found") 
     77 
    4178 
    4279class NULL(object): 
    4380    def __repr__(self): 
    4481        return "()" 
     82    def __iter__(self): 
     83        return (x for x in []) 
    4584NULL = NULL() 
    4685 
    4786class UNDEF(object): pass 
    4887UNDEF = UNDEF() 
    49  
    50 class ConsList(object): 
    51     def __init__(self, xs=[]): 
    52         if len(xs) == 0: 
    53             self.v = NULL 
    54         else: 
    55             if isinstance(xs[0], list): 
    56                 xs[0] = ConsList(xs[0]) 
    57                  
    58             if len(xs) == 3 and xs[1] == ".": 
    59                 self.v = Pair(xs[0], xs[2]) 
    60             elif len(xs) == 1: 
    61                 self.v = Pair(xs[0], NULL) 
    62             else: 
    63                 self.v = Pair(xs[0], ConsList(xs[1:])) 
    64      
    65     def setv(self, v): 
    66         self.v = v 
    67         return self 
    68          
    69     def __repr__(self): 
    70         return str(self.v) 
    71  
    7288 
    7389class Lambda(object): 
     
    104120            stack[-1].append(t) 
    105121 
    106     return result[0] 
    107  
    108 def build_conslist(stree): 
    109     "syntax tree -> cons list" 
    110      
     122    return Pair.from_list(result[0]) 
     123 
    111124 
    112125def add(xs): 
     
    152165# macro table 
    153166def macro_define(tree): 
    154     if isinstance(tree[1], str): # symbol 
    155         e.scope[tree[1]] = evaluate(tree[2]) 
     167    if isinstance(tree.car, str): # symbol 
     168        e.scope[tree.cdar] = evaluate(tree.cddr) 
    156169    else: 
    157170        func_name = tree[1][0] 
     
    186199 
    187200def macro_define_macro(tree): 
    188     macro_table[tree[1][0]] = lambda xs: Lambda(tree[1][1:], tree[2], e.scope)( 
    189         map(evaluate, cdr(xs))) 
     201    macro_table[tree.cdar] = \ 
     202        lambda xs: Lambda(tree.cdadr, tree.cddar, e.scope)( 
     203        evaluate(xs, cdr)) 
    190204 
    191205def macro_quote(tree): 
     
    203217 
    204218def evaluate(tree): 
    205     if tree == []: return [] 
    206     if isinstance(tree, list): 
    207         car = tree[0] 
     219    if tree == NULL: return NULL 
     220    if isinstance(tree, Pair): 
     221        car = tree.car 
    208222        if car in macro_table: 
    209223            return macro_table[car](tree) 
    210224             
    211225        car = evaluate(car) 
    212         cdr = tree[1:] 
    213         cdr = map(evaluate, cdr) 
    214         return car(cdr)  
     226        cdr = tree.cdr 
     227        print cdr 
     228        args = map(evaluate, cdr) 
     229        return car(args)  
    215230    else: 
    216         if tree[0] in "0123456789": 
     231        if isinstance(tree, str) and tree[0] in "0123456789": 
    217232            return int(tree) # int leteral 
    218233        else: 
     
    222237e.scope = scope 
    223238 
    224 if 0: 
     239if 1: 
    225240    old_e = evaluate 
    226241    indent = 0 
     
    231246        result = old_e(tree) 
    232247        print " " * indent + str(result) 
     248        indent -= 4 
    233249        return result 
    234250 
     
    242258    )""")) 
    243259 
     260def test(): 
     261    print evaluate(parse("(* 1 2)")) 
     262 
     263 
    244264test() #============= 
    245265 
     266#================================ 
    246267def test(): 
    247268    assert 89 == e(parse(""" 
     
    347368    print e(parse("(+ x 1)")) 
    348369 
    349 """ 
    350 >>> print parse("(* (+ 1 2) (- 3 4))") 
    351 ['*', ['+', '1', '2'], ['-', '3', '4']] 
    352 """