http://www.cs.wustl.edu/~cytron/cse547/PDFs/p1.pdf