# Programming Language Design Final Report
To finish your final report, you have 2 choices:
* Summarize and comments on one of listed paper
* Implement a programming project and write a short report
Please submit your report before 2020/01/01 23:55 and follow the format listed below.
## report format
* PDF file, naming it in the format like `A1-107525008.pdf` where `A1` meaning the 1st paper in A.
* A4 paper, 1 or 2 pages
* one/two column are both acceptable.
* font: 標楷體(Chinese)/Times New Roman(English)
* font size is 10pt.
* line spacing is single line (1x line).
* margin: 1.5inch on each side
# A. Paper Summarizing and Commenting
Pick one paper from the list below,
summarize the picked one and write down your summary and comments.
1. [Lightweight Modular Staging: A Pragmatic Approach to Runtime Code Generation and Compiled DSLs](https://www.researchgate.net/publication/45581394_Lightweight_Modular_Staging_A_Pragmatic_Approach_to_Runtime_Code_Generation_and_Compiled_DSLs)
2. [Data exploration through dot-driven development](http://drops.dagstuhl.de/opus/volltexte/2017/7261/pdf/LIPIcs-ECOOP-2017-21.pdf)
3. [Aspect-oriented programming](https://www.cs.ubc.ca/~gregor/papers/kiczales-ECOOP1997-AOP.pdf)
4. [One VM to Rule Them All](http://lafo.ssw.uni-linz.ac.at/papers/2013_Onward_OneVMToRuleThemAll.pdf)
5. [Traits: Composable Units of Behavior](http://scg.unibe.ch/archive/papers/Scha03aTraits.pdf)
Please note that simply copy-translate-paste from article won't get any score.
# B. Programming Project
Please also submit your source code with your report.
## 1 - Rational Arithmetic Evaluation
In this assignment, you are asked to implement a arithmetic evaluator with rational numbers in Haskell.
Minimal requirements:
* Able to do add/subtract/multiply/divide computations on rational numbers.
* Print the result in simplified form
* Store rational number as two integers(numerator and denominator) instead of float numbers.
Example:
* `(1%2) + (3%4) * (5%6) - (2%1) / (1%2)` will evaluates to `(-23) % 8` where `(a%b)` means $\frac{a}{b}$
* `(1%1) / (2%0)` will report a "divide by zero" error
Please explain your design in the report, for example:
* Overview of your code
* Data Structures you defined
* Idioms or Design Patterns you used
* ...