Files
IronCalc/base/CALC.md
Nicolás Hatcher 71a2bb2dca WIP
2025-10-03 12:08:06 +02:00

1.2 KiB

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