A toy "spreadsheet" implementation. More precisely, it's an implementation of a strongly-typed interpreted language that supports a very small list of primitives:
- Boolean, int, floating, and string primitives
- Variables
- Arithmetic (including mixed integer/floating math)
- Sum function
- If-expressions
- Equality checking (as a function; I did not implement non-arithmetic infix operators)
This is a toy implementation, so a number of useful features are not currently implemented (perhaps further work will come), such as:
- Non-arithmetic infix operators (e.g. comparisons, boolean operators, string concatenation)
- Rows/columns/ranges
- Lambdas
- Cell formatting
The CLI supports three instructions:
e <cellname> <contents>: Write<contents>into the cell<cellname>p <cellname>: Prints the raw contents of the cellv <cellname>: Prints the calculated value of the cell
I didn't implement readline semantics, so it is recommended to run this with
rlwrap. To run, simply execute stack run or rlwrap stack run in the root
of this repository. Tested using stack 2.7.5.
# rlwrap stack run
> e a1 3+4*5*6-7+8
> p a1
"3+4*5*6-7+8"
> v a1
Int 124
> e a2 0.4-100*3.8+7
> p a2
"0.4-100*3.8+7"
> v a2
Floating (-372.6)
> e a3 equal(a1, a2)
> v a3
False
> e a4 if(a3, false, true)
> v a4
True
> e a5 if(a4, a1-a2, sum(a1, a2, a1*a2))
> v a5
Floating 496.6
> e a1 -372.6
> v a5
Floating 138085.56
See spec/Test.hs and try running stack test to see the unit test that
corresponds to this session