[Tutor] Learning about other languages by using Python [Scheme!]

Danny Yoo dyoo@hkn.eecs.berkeley.edu
Tue, 23 Oct 2001 22:58:27 -0700 (PDT)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--545280650-737955794-1003903107=:15261
Content-Type: TEXT/PLAIN; charset=US-ASCII


[Skip this message if you're just beginning to learn Python; this post
refers to another language called Scheme, so it might be confusing.]


Hi everyone,

I'm thinking of writing a silly Scheme interpreter in Python; hopefully
I'll be able to get it done before I forget.  *grin*

Scheme is one of the "simple" languages that beginning computer science
students often play with.  It has almost no syntax, which makes it
relatively easy to write a parser for it.

Almost all of Scheme is based on processing lists, so Scheme optimizes its
syntax toward list building.  For example, in Scheme,

    (one two (three) 4)

is equivalent to Python's:

    ['one', 'two', ['three'], 4]


Just in case I get hit by a bus, I'll send off a bit that already (sorta)
works to Useless Python.


###
dyoo@einfall:~/pyscheme$ python schemeparser.py
Type 'quit' to exit this test.

[SchemeParser] >>> (define (square x) (* x x))
['define', ['square', 'x'], ['*', 'x', 'x']]

[SchemeParser] >>> (1 2 3 4 (5 6 (7 8 (9))) 10)
[1, 2, 3, 4, [5, 6, [7, 8, [9]]], 10]

[SchemeParser] >>> this shouldn't work
Uh oh! While trying to eat None: got token ('symbol', 'shouldn') instead.

[SchemeParser] >>> ''''muhahaha
['quote', ['quote', ['quote', ['quote', 'muhahaha']]]]
###


Hope this helps!

--545280650-737955794-1003903107=:15261
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="prompt.py"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.21.0110232258260.15261@hkn.eecs.berkeley.edu>
Content-Description: 
Content-Disposition: attachment; filename="prompt.py"

IiIiQSBzbWFsbCBwcm9tcHRpbmcgY2xhc3MuDQoNCkRhbm55IFlvbyAoZHlv
b0Boa24uZWVjcy5iZXJrZWxleS5lZHUpDQoNClRoaXMgaGFzbid0IGJlZW4g
dG9vIGRvY3VtZW50ZWQgeWV0LiAgVGhlcmUncyBzb21lIHNhbXBsZSB1c2Vz
IG9uDQp0aGUgYm90dG9tIHdpdGggdGhlIHRlc3QoKSBmdW5jdGlvbiBiZWxv
dy4NCiIiIg0KDQoNCiMjIEZpcnN0LCBsZXQncyBzZWUgaWYgd2UgY2FuIGxv
YWQgdXAgcmVhZGxpbmUgYW5kIG1ha2UgcmF3X2lucHV0KCkNCiMjIG5pY2Ug
dG8gd29yayB3aXRoLg0KdHJ5Og0KICAgIGltcG9ydCByZWFkbGluZQ0KZXhj
ZXB0IEltcG9ydEVycm9yOiBwYXNzDQoNCmltcG9ydCBzeXMNCmltcG9ydCBw
cHJpbnQNCg0KY2xhc3MgUHJvbXB0Og0KICAgIGRlZiBfX2luaXRfXyhzZWxm
LCBuYW1lLCBxdWl0X3N0ciA9ICdxdWl0JywgcXVpdF9jbWQ9c3lzLmV4aXQs
DQogICAgICAgICAgICAgICAgIGNhbGxiYWNrPU5vbmUpOg0KICAgICAgICBz
ZWxmLm5hbWUgPSBuYW1lDQogICAgICAgIHNlbGYucXVpdF9zdHIgPSBxdWl0
X3N0cg0KICAgICAgICBzZWxmLnF1aXRfY21kID0gcXVpdF9jbWQNCiAgICAg
ICAgc2VsZi5jYWxsYmFjayA9IGNhbGxiYWNrDQogICAgICAgIA0KICAgIGRl
ZiBwcm9tcHRMb29wKHNlbGYpOg0KICAgICAgICB3aGlsZSAxOg0KICAgICAg
ICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHMgPSByYXdfaW5wdXQoJ1sl
c10gPj4+ICcgJSBzZWxmLm5hbWUpDQogICAgICAgICAgICAgICAgaWYgcyA9
PSBzZWxmLnF1aXRfc3RyOg0KICAgICAgICAgICAgICAgICAgICByYWlzZSBF
T0ZFcnJvcg0KICAgICAgICAgICAgICAgIGVsaWYgcyBhbmQgc2VsZi5jYWxs
YmFjazoNCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jYWxs
YmFjayhzKQ0KICAgICAgICAgICAgICAgICAgICBpZiByZXN1bHQgIT0gTm9u
ZToNCiAgICAgICAgICAgICAgICAgICAgICAgIHBwcmludC5wcHJpbnQocmVz
dWx0KQ0KICAgICAgICAgICAgZXhjZXB0IChFT0ZFcnJvciwgS2V5Ym9hcmRJ
bnRlcnJ1cHQpOg0KICAgICAgICAgICAgICAgIHByaW50DQogICAgICAgICAg
ICAgICAgcmV0dXJuIHNlbGYucXVpdF9jbWQNCg0KDQoNCiMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMNCg0KIyMgTm90ZTogSSBzaG91bGQgcHJvYmFibHkg
dXNlIHRoZSB1bml0IHRlc3RpbmcgbW9kdWxlcy4NCmRlZiB0ZXN0KCk6DQog
ICAgZGVmIGVjaG9DYWxsYmFjayhzKToNCiAgICAgICAgcHJpbnQgcw0KICAg
IHAgPSBQcm9tcHQoJ3Rlc3QnLCBjYWxsYmFjaz1lY2hvQ2FsbGJhY2spDQog
ICAgcC5wcm9tcHRMb29wKCkNCg0KDQppZiBfX25hbWVfXyA9PSAnX19tYWlu
X18nOg0KICAgIHRlc3QoKQ0K
--545280650-737955794-1003903107=:15261
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="schemeparser.py"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.21.0110232258270.15261@hkn.eecs.berkeley.edu>
Content-Description: 
Content-Disposition: attachment; filename="schemeparser.py"

aW1wb3J0IHJlDQoNCiIiIkEgc21hbGwgc2NoZW1lIHBhcnNlci4NCg0KRGFu
bnkgWW9vIChkeW9vQGhrbi5lZWNzLmJlcmtlbGV5LmVkdSkNCk9jdG9iZXIg
MjMsIDIwMDEuDQoNCkEgcmVjdXJzaXZlIGRlc2NlbnQgcGFyc2VyLCBxdWlj
a2x5IGNvb2tlZCB1cC4gIE5vIHNwZWNpYWwgbGlicmFyaWVzDQpuZWNlc3Nh
cnkgZXhjZXB0IGZvciB0aGUgJ3JlJyByZWd1bGFyIGV4cHJlc3Npb24gbGli
cmFyeS4NCg0KVGhpcyBwYXJzZXIgbWlnaHQgYmUgdXNlZnVsIGlmIHdlIHdh
bnRlZCB0byBncmFiIGluZm9ybWF0aW9uIGZyb20gdGhlDQp1c2VyIHVzaW5n
IFNjaGVtZWlzaCBsaXN0cy4gIEl0IG1pZ2h0IGFsc28gYmUgbmljZSBpZiBv
bmUgaXMgcGxhbm5pbmcNCnRvIHdyaXRlIGEgU2NoZW1lIGludGVycHJldGVy
IGluIFB5dGhvbi4NCg0KVGhlIG1haW4gZnVuY3Rpb25zIHRvIHVzZSBpbiB0
aGlzIG1vZHVsZSBhcmUNCg0KICAgIHRva2VuaXplKCk6IG1ha2VzIGEgbGlz
dCBvZiB0b2tlbnMgb3V0IG9mIGEgc3RyaW5nDQogICAgcGFyc2VFeHByZXNz
aW9uKCk6IHR1cm5zIHRob3NlIHRva2VucyBpbnRvIGEgcGFyc2VkIGV4cHJl
c3Npb24NCg0KQW4gZXh0cmEgc3RyaWN0ICdwYXJzZVNpbmdsZUV4cHJlc3Np
b24oKScgbWFrZXMgc3VyZSB0aGF0IGl0IHVzZXMgdXANCmFsbCB0aGUgdG9r
ZW5zIHRoYXQgaXQgaGFzIGJlZW4gZ2l2ZW4uDQoNCklmIGFueXRoaW5nIGJh
ZCBoYXBwZW5zIGR1cmluZyB0aGUgcGFyc2luZywgd2UnbGwgcmFpc2UgYSBQ
YXJzZXJFcnJvci4NCiIiIg0KDQoNCg0KIiIiVGhlIEVuZCBPZiBGaWxlIHRv
a2VuIGlzIGEgc2VudGluYWwgdGhhdCB0ZXJtaW5hdGVzIGEgbGlzdCBvZiB0
b2tlbnMuIiIiDQpFT0ZfVE9LRU4gPSAoTm9uZSwgTm9uZSkNCg0KDQoiIiJI
ZXJlIGFyZSB0aGUgcGF0dGVybnMgd2UgcGF5IGF0dGVudGlvbiB3aGVuIGJy
ZWFraW5nIGRvd24gYSBzdHJpbmcNCmludG8gdG9rZW5zLiIiIg0KUEFUVEVS
TlMgPSBbICgnd2hpdGVzcGFjZScsIHJlLmNvbXBpbGUocidccysnKSksDQog
ICAgICAgICAgICAgKCcoJywgcmUuY29tcGlsZShyJ1woJykpLA0KICAgICAg
ICAgICAgICgnKScsIHJlLmNvbXBpbGUocidcKScpKSwNCiAgICAgICAgICAg
ICAoJ251bWJlcicsIHJlLmNvbXBpbGUocicnJ1xkK1wuXGQrDQogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcZCtcLg0KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XC5cZCsNCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxkKycnJywNCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUuVkVSQk9TRSkp
LA0KICAgICAgICAgICAgICgnc3ltYm9sJywgcmUuY29tcGlsZShyJycnW2Et
ekEtWlwrXD9cIVxAXCNcJFwlXF5cJlwqXC1cL1wuXQ0KICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgW1x3XCtcP1whXEBcI1wkXCVc
XlwmXCpcLVwvXC5dKicnJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcmUuVkVSQk9TRSkpLA0KICAgICAgICAgICAgICgnXCcnLCBy
ZS5jb21waWxlKHInXCcnKSksDQogICAgICAgICAgICAgXQ0KDQoNCmRlZiB0
b2tlbml6ZShzKToNCiAgICAiIiJHaXZlbiBhIHN0cmluZyAncycsIHJldHVy
biBhIGxpc3Qgb2YgaXRzIHRva2Vucy4NCiAgICBBIHRva2VuIGNhbiBiZSBv
bmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlczoNCg0KICAgICAgICBbIigiLCAi
KSIsIE5VTUJFUiwgU1lNQk9MLCAiXCciXQ0KICAgICAgICANCiAgICBhbmQg
ZWFjaCB0b2tlbiBpcyBhIDItdHVwbGU6ICh0eXBlLCBjb250ZW50KS4NCiAg
ICAiIiINCiAgICB0b2tlbnMgPSBbXQ0KICAgIHdoaWxlIDE6DQogICAgICAg
IHNob3VsZF9jb250aW51ZSA9IDANCiAgICAgICAgZm9yIHR5cGUsIHJlZ2V4
IGluIFBBVFRFUk5TOg0KICAgICAgICAgICAgbWF0Y2hfb2JqID0gcmVnZXgu
bWF0Y2gocykNCiAgICAgICAgICAgIGlmIG1hdGNoX29iajoNCiAgICAgICAg
ICAgICAgICBzaG91bGRfY29udGludWUgPSAxDQogICAgICAgICAgICAgICAg
dG9rZW5zLmFwcGVuZCggKHR5cGUsIG1hdGNoX29iai5ncm91cCgwKSkgKQ0K
ICAgICAgICAgICAgICAgIHMgPSBzW21hdGNoX29iai5zcGFuKClbMV0gOl0N
CiAgICAgICAgaWYgc2hvdWxkX2NvbnRpbnVlID09IDA6DQogICAgICAgICAg
ICBicmVhaw0KICAgIHRva2Vucy5hcHBlbmQoRU9GX1RPS0VOKQ0KICAgIHJl
dHVybiBmaWx0ZXIobGFtYmRhIHg6IHhbMF0gIT0gJ3doaXRlc3BhY2UnLCB0
b2tlbnMpDQoNCg0KIiIiV2l0aCB0aGUgbGV4ZXIgZG9uZSwgbm93IGxldCdz
IGRpcmVjdCBvdXIgYXR0ZW50aW9uIHRvIHRoZSBwYXJzZXIuIiIiDQojIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCmNsYXNzIFBhcnNlckVycm9yKEV4
Y2VwdGlvbik6DQogICAgIiIiT3VyIHBlcnNvbmFsaXplZCBleGNlcHRpb24g
Y2xhc3MuIiIiDQogICAgcGFzcw0KDQoNCmRlZiBwZWVrKHRva2Vucyk6DQog
ICAgIiIiVGFrZSBhIHF1aWNrIGdsYW5jZSBhdCB0aGUgZmlyc3QgdG9rZW4g
aW4gb3VyIHRva2VucyBsaXN0LiIiIg0KICAgIGlmIGxlbih0b2tlbnMpID09
IDA6DQogICAgICAgIHJhaXNlIFBhcnNlckVycm9yLCAiV2hpbGUgcGVla2lu
ZzogcmFuIG91dCBvZiB0b2tlbnMuIg0KICAgIHJldHVybiB0b2tlbnNbMF0N
Cg0KDQpkZWYgZWF0KHRva2VucywgdHlwZSk6DQogICAgIiIiRGlnZXN0IHRo
ZSBmaXJzdCB0b2tlbiBpbiBvdXIgdG9rZW5zIGxpc3QsIG1ha2luZyBzdXJl
IHRoYXQgd2UncmUNCiAgICBiaXRpbmcgb24gdGhlIHJpZ2h0IHR5cGUgb2Yg
dGhpbmcuIiIiDQogICAgaWYgbGVuKHRva2VucykgPT0gMDoNCiAgICAgICAg
cmFpc2UgUGFyc2VyRXJyb3IsICJXaGlsZSB0cnlpbmcgdG8gZWF0ICVzOiBy
YW4gb3V0IG9mIHRva2Vucy4iICUgXA0KICAgICAgICAgICAgICAocmVwcih0
eXBlKSwpDQogICAgaWYgdG9rZW5zWzBdWzBdICE9IHR5cGU6DQogICAgICAg
IHJhaXNlIFBhcnNlckVycm9yLCAiV2hpbGUgdHJ5aW5nIHRvIGVhdCAlczog
Z290IHRva2VuICVzIGluc3RlYWQuIiAlIFwNCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAocmVwcih0eXBlKSwgcmVwcih0b2tlbnNbMF0pKQ0KICAg
IHJldHVybiB0b2tlbnMucG9wKDApDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMNCiIiIkJlbG93IGlzIGEgYnVuY2ggb2YgcGFyc2luZyBmdW5jdGlv
bnMuICBXZSdsbCB1c2UgYSByZWN1cnNpdmUNCmRlc2NlbnQgcGFyc2luZyB0
ZWNobmlxdWUsIHNpbmNlIFNjaGVtZSBpcyBzbyB3ZWxsIHN1aXRlZCBmb3Ig
aXQuIiIiDQoNCg0KZGVmIHBhcnNlU2luZ2xlRXhwcmVzc2lvbih0b2tlbnMp
Og0KICAgICIiIlJldHVybnMgYSBzaW5nbGUgRXhwcmVzc2lvbiwgZ2l2ZW4g
YSBzZXF1ZW5jZSBvZiB0b2tlbnMuDQogICAgUmFpc2VzIGEgUGFyc2VyRXhj
ZXB0aW9uIGlmIG91ciB0b2tlbnMgaGF2ZW4ndCBiZWVuIGV4aGF1c3RlZC4i
IiINCiAgICBleHByZXNzaW9uID0gcGFyc2VFeHByZXNzaW9uKHRva2VucykN
CiAgICBlYXQodG9rZW5zLCBOb25lKSAgIyMgRWF0IHRoZSBFT0YgdG9rZW4N
CiAgICByZXR1cm4gZXhwcmVzc2lvbg0KDQoNCmRlZiBwYXJzZUV4cHJlc3Np
b24odG9rZW5zKToNCiAgICAiIiJSZXR1cm5zIGFuIEV4cHJlc3Npb24sIGdp
dmVuIGEgc2VxdWVuY2Ugb2YgdG9rZW5zLg0KICAgIEFuIGV4cHJlc3Npb24g
aXMgbWFkZSB1cCBvZiBvbmUgb2YgdGhlIGZvbGxvd2luZyB0aGluZ3M6DQog
ICAgICAgIG8gIEEgcXVvdGVkIGV4cHJlc3Npb24NCiAgICAgICAgbyAgQW4g
YXRvbSAobGlrZSBhIG51bWJlciBvciBzeW1ib2wpDQogICAgICAgIG8gIEEg
bGlzdC4NCiAgICBUaGlzIHByb2NlZHVyZSB0cmllcyB0byB0YWtlIGNhcmUg
b2YgYWxsIHRoZXNlIHBvdGVudGlhbHMuIiIiDQogICAgbG9va19haGVhZF90
eXBlID0gcGVlayh0b2tlbnMpWzBdDQogICAgaWYgbG9va19haGVhZF90eXBl
ID09ICdcJyc6DQogICAgICAgIGVhdCh0b2tlbnMsICdcJycpDQogICAgICAg
IHJldHVybiBbJ3F1b3RlJywgcGFyc2VFeHByZXNzaW9uKHRva2VucyldDQog
ICAgZWxpZiBsb29rX2FoZWFkX3R5cGUgPT0gJygnOg0KICAgICAgICByZXR1
cm4gcGFyc2VMaXN0KHRva2VucykNCiAgICBlbGlmIGxvb2tfYWhlYWRfdHlw
ZSBpbiAoJ251bWJlcicsICdzeW1ib2wnKToNCiAgICAgICAgcmV0dXJuIHBh
cnNlQXRvbSh0b2tlbnMpDQoNCg0KZGVmIHBhcnNlQXRvbSh0b2tlbnMpOg0K
ICAgICIiIlJldHVybnMgYW4gQXRvbSwgZ2l2ZW4gYSBzZXF1ZW5jZSBvZiB0
b2tlbnMuDQogICAgQW4gYXRvbSBpcyBlaXRoZXIgYSBudW1iZXIgb3IgYSBz
eW1ib2wuIiIiDQogICAgaWYgcGVlayh0b2tlbnMpWzBdID09ICdudW1iZXIn
Og0KICAgICAgICByZXR1cm4gZXZhbChlYXQodG9rZW5zLCAnbnVtYmVyJylb
MV0sIHt9KSAgIyMgZXZhbCgpIHNob3VsZCBiZSBvaw0KICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgc2lu
Y2UgdGhlIGlucHV0IGlzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAjIyBzYW50aXRpemVkLg0KICAgIGVs
c2U6DQogICAgICAgIHJldHVybiBlYXQodG9rZW5zLCAnc3ltYm9sJylbMV0N
Cg0KDQpkZWYgcGFyc2VMaXN0KHRva2Vucyk6DQogICAgIiIiUmV0dXJucyBh
IExpc3QgdGhhdCBwb3NzaWJseSBjb250YWlucyBhIGJ1bmNoIG9mIEV4cHJl
c3Npb25zLiIiIg0KICAgIGVhdCh0b2tlbnMsICcoJykNCiAgICBwYXJzZWRf
ZWxlbWVudHMgPSBbXQ0KICAgIHdoaWxlIDE6DQogICAgICAgIGxvb2tfYWhl
YWRfdHlwZSA9IHBlZWsodG9rZW5zKVswXQ0KICAgICAgICBpZiBsb29rX2Fo
ZWFkX3R5cGUgaW4gKCdcJycsICcoJywgJ251bWJlcicsICdzeW1ib2wnKToN
CiAgICAgICAgICAgIHBhcnNlZF9lbGVtZW50cy5hcHBlbmQocGFyc2VFeHBy
ZXNzaW9uKHRva2VucykpDQogICAgICAgIGVsc2U6IGJyZWFrDQogICAgZWF0
KHRva2VucywgJyknKQ0KICAgIHJldHVybiBwYXJzZWRfZWxlbWVudHMNCg0K
DQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KaWYgX19uYW1lX18g
PT0gJ19fbWFpbl9fJzoNCiAgICAiIiJBIGxpdHRsZSB0ZXN0IGhhcm5lc3Mg
Zm9yIHRoZSBwYXJzZXIuIiIiDQogICAgZGVmIF9jYWxsYmFjayhzKToNCiAg
ICAgICAgdHJ5Og0KICAgICAgICAgICAgcHJpbnQgcGFyc2VTaW5nbGVFeHBy
ZXNzaW9uKHRva2VuaXplKHMpKQ0KICAgICAgICBleGNlcHQgUGFyc2VyRXJy
b3IsIHM6DQogICAgICAgICAgICBwcmludCAiVWggb2ghIiwgcw0KICAgIGZy
b20gcHJvbXB0IGltcG9ydCBQcm9tcHQNCiAgICBwID0gUHJvbXB0KG5hbWU9
IlNjaGVtZVBhcnNlciIsIGNhbGxiYWNrPV9jYWxsYmFjaykNCiAgICBwcmlu
dCAiVHlwZSAncXVpdCcgdG8gZXhpdCB0aGlzIHRlc3QuIg0KICAgIHAucHJv
bXB0TG9vcCgpDQo=
--545280650-737955794-1003903107=:15261--