Project proposal and Final Project

Your final project represents multiple weeks of concerted effort in the design and implementation of a substantial piece of software with tests. If you opted to explore a more well-defined path (in which there is no shame—it is a path guaranteed to provide many learning opportunities), you probably:

  1. ... extended your interpreter to handle recursive functions, or perhaps you  implemented side-effects and an object system.
  2. ... opted to implement a garbage collector.
  3. ... focused on web application development in a popular scripting language as compared to Scheme.

If you do not choose to travel a well-defined path, then I offer two well-undefined paths that you might consider as well.

Research and Interpretation

paradigmsEng104small

Consider the poster copied from Peter van Roy's pages at UCL. (I've provided a local copy of the PDF as well.) You might research one of the languages in this poster, focus on those qualities that dictate where it is in this tree, and implement an interpreter for those language features.

For example, you might implement message-passing concurrent programming a la Erlang or occam; the former has single assignment and first-class functions, while the second has mutability of state within a very limited scope. Also, the former is characterized by having asynchronous channels, while the latter employs single-cell, blocking communications.

Your project will present your research, your interpreter as demonstration of your understanding, and tests that demonstrate that your project is correct. It may be subject to code review.

Reflection and Reimplementation

Another path you might take is to re-implement one or more of the interpreters from class in a language you are familiar with. In this case, code quality is critical. As a transcription exercise, it is uninteresting. Therefore, your implementation, testing, and reflection will be carefully scrutinized for their thoroughness and quality.

Deep Language Exploration

Lastly, you might focus on exploring a language you do not know deeply. This implies that you will explore the literature surrounding the design and implementation of this language (and provide a review of your reading) and implement an interesting (and ideally idiomatic) application in this language.

Reflection

In your portfolio submission, there is less room for reflection, as the final project will not have the same opportunities for revision as other parts of the portfolio. However, your writeup should highlight those aspects of your learning that you feel are reflected in your work.