@@ -26,13 +26,51 @@ def rest(s):
26
26
return s [1 ]
27
27
28
28
29
+ # A linked list is a sequence:
30
+ # it has a finite length and supports element selection by index
29
31
# Linked List Class
30
32
class Link :
31
- pass
33
+ """ A linked list with a first element and the rest"""
34
+ empty = ()
35
+ def __init__ (self , first , rest = empty ):
36
+ # the empty list is a special case of a linked list
37
+ # that has no first element or rest
38
+ assert rest is Link .empty or isinstance (rest , Link )
39
+ self .first = first
40
+ self .rest = rest
32
41
42
+ def __getitem__ (self , i ):
43
+ if i == 0 :
44
+ return self .first
45
+ else :
46
+ return self .rest [i - 1 ]
47
+
48
+ def __len__ (self ):
49
+ return 1 + len (self .rest )
50
+
51
+ def __repr__ (self ):
52
+ if self .rest is Link .empty :
53
+ rest = ''
54
+ else :
55
+ rest = ', ' + repr (self .rest )
56
+ return 'Link({0}{1})' .format (s .first , rest )
57
+
58
+
59
+ def link_expression (s ):
60
+ """return a string that would evaluate to s"""
61
+ if s .rest is Link .empty :
62
+ rest = ''
63
+ else :
64
+ rest = ', ' + link_expression (s .rest )
65
+ return 'Link({0}{1})' .format (s .first , rest )
33
66
34
67
35
68
if __name__ == "__main__" :
36
69
four = link (1 , link (2 , link (3 , link (4 , "empty" ))))
37
70
print (first (four ))
38
- print (rest (four ))
71
+ print (rest (four ))
72
+ #
73
+ s = Link (3 , Link (4 , Link (5 )))
74
+ print (s [0 ])
75
+ #Link.__repr__ = link_expression
76
+ print (s )
0 commit comments