Skip to content

Commit 4e60cf8

Browse files
update
1 parent 64c26b8 commit 4e60cf8

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

README.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
- **All objects can be treated as data**
1717

1818

19-
#### dynamic program language
20-
2119
#### tips
2220
* ipdb debugger
2321
> import ipdb; ipdb.set_trace()

sicp/python/link.py

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,51 @@ def rest(s):
2626
return s[1]
2727

2828

29+
# A linked list is a sequence:
30+
# it has a finite length and supports element selection by index
2931
# Linked List Class
3032
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
3241

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

3467

3568
if __name__ == "__main__":
3669
four = link(1, link(2, link (3, link(4, "empty"))))
3770
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

Comments
 (0)