Authors:
Curtis Chin Jen Sem - 5601118
Daniel Kamphorst - 6050107
Noud Savenije - 4302907
The environment the program start with contains a chain of integer references, a chain referencing an empty cell, and a chain referencing a cycle.
- Arrow keys to move
- Switching modes is done using the Enter key, there are 2 modes
- Edit mode where it is possible to edit the expression in the current cell
- View mode where navigation is possible
- The Escape key exits the program
- Expression notation:
- Integers:
1
,-2
,123213
- Double:
1.0
,2.01
,1.0e-12
- References: Tuples are written as
(y, x)
(or(rows, columns)
)- Absolute references:
(1, 3)
,(91, 1212)
- Relative references:
$(0, 0)
,$(1, 0)
- Absolute references:
- Plus:
$(0, 0) + 3
,1.0 + $(1, 0)
- Integers:
- Expressions
- Empty
- Literals (Integers, Doubles)
- References (Relative, Absolute)
- Operators (+)
- Seperate layers for expressions and values
- Both layers use Data.Map as underlying data store, so the size of the sheet is limited by memory (and or traversal time of Data.Map, considering lookup isn't constant)
- Ensures that expressions are evaluated at most once
- The moment a cell is evaluated, the value is inserted into the view layer of the environment and reused
- Any expression containing a reference first checks if that reference has been calculated before
- Graph evaluation
- Only update the necessary cells when inserting
- Cycle detection
- Type errors, errors and warnings.
- We differentiate between a cycle itself, and referencing cycles. Both are treated as errors.
- Referencing an empty cell is treated as a warning due to an empty cell maybe being useful in some way.
- However, using that empty reference in an operation results in a type error. Same with using a reference to a cell containing an error.
- Multiple types
- Type checker implemented which inserts type errors where relevant into the view
- Unable to do operations on expressions of different types
- Types currently implemented: Int, Float, Empty, Error
- We decided against int-to-float coercion to demonstrate the type checkers ability to handle the possible future extension of currencies
- app/
- Main.hs: Contains the brick application which makes using the necessary functions from the library
- src/
- Excelent/
- Definition.hs: Contains the data definitions used in the rest of the application. Also calls the necessary template haskell functions from the relevant libraries
- Parser.hs: Contains the expression parser
- Print.hs: Contains usefull functions for printing the content of cells
- Eval/
- Eval: Contains the expression evaluating function
- Graph: Contains functions for generating graphs from expressions. Also contains the code for complete, partial updates and error detection.
- Checker: Contains the type checking function
- Excelent/