WIP
This commit is contained in:
61
base/CALC.md
Normal file
61
base/CALC.md
Normal file
@@ -0,0 +1,61 @@
|
||||
# Evaluation Strategy
|
||||
|
||||
|
||||
We have a list of the spill cells:
|
||||
|
||||
```
|
||||
// Checks if the array starting at cell will cover cells whose values
|
||||
// has been requested
|
||||
def CheckSpill(cell, array):
|
||||
for c in cell+array:
|
||||
support CellHasBeenRequested(c):
|
||||
if support is not empty:
|
||||
return support
|
||||
return []
|
||||
|
||||
// Fills cells with the result (an array)
|
||||
def FillCells(cell, result):
|
||||
|
||||
|
||||
def EvaluateNodeInContext(node, context):
|
||||
match node:
|
||||
case OP(left, right, op):
|
||||
l = EvaluateNodeInContext(left, context)?
|
||||
r = EvaluateNodeInContext(left, context)?
|
||||
return op(l, r)
|
||||
case FUNCTION(args, fn):
|
||||
...
|
||||
case CELL(cell):
|
||||
EvaluateCell(cell)
|
||||
case RANGE(start, end):
|
||||
...
|
||||
|
||||
|
||||
|
||||
def EvaluateCell(cell):
|
||||
if IsCellEvaluating(cell):
|
||||
return CIRC
|
||||
MarkEvaluating(cell)
|
||||
result = EvaluateNodeInContext(cell.formula, cell)
|
||||
if isSpill(result):
|
||||
CheckSpill(cell, array)?
|
||||
FillCells(result)
|
||||
|
||||
|
||||
def EvaluateWorkbook():
|
||||
spill_cells = [cell_1, ...., cell_n];
|
||||
|
||||
|
||||
for cell in spill_cells:
|
||||
result = evaluate(cell)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# When updating a cell value
|
||||
|
||||
If it was a spill cell we nee
|
||||
Reference in New Issue
Block a user