Skip to content

v2.5.0: an example that runs

Choose a tag to compare

@ryanduguid ryanduguid released this 18 Aug 16:02
· 46 commits to main since this release

A documentation release. No formula and no defined name's behaviour differs from v2.4.0.

nb.TimelineOffsetλ's worked example could not be run as printed

The call was missing the two closing brackets that finish EDATE and the function call itself, so copying the one line a reader is meant to copy got a syntax error rather than an answer. The Result column beside it was empty, where every other example in the library prints what it returns, which is how the missing brackets went unseen: there was no answer to disagree with.

Before

Result         →Formula (nb is assumed to be the module's name)
               →=nb.TimelineOffsetλ("15/2/2024", EDATE("1/1/2025", SEQUENCE( , 12, 0)

After

Result         →Formula (nb is assumed to be the module's name)
1              →=nb.TimelineOffsetλ("15/2/2026", EDATE("1/1/2026", SEQUENCE( , 12, 0)))
-11            →=nb.TimelineOffsetλ("15/2/2025", EDATE("1/1/2026", SEQUENCE( , 12, 0)))

Two rows now, against the same 1 January 2026 timeline the demonstration sheet builds, one date inside it and one before it, because a date falling before a model's timeline is what the function's own discussion comment is written for. Upstream wrote the example against 2/15/2022 and a timeline starting 1/1/2023, and the date sweep moved both forward two years with everything else, which still left it two years behind the rest of the sample data.

tools/excel_selftest.ps1 runs both examples and holds them to their printed results, 1 and -11, so the printed answer cannot drift from the call beside it again. 197 assertions, up from 195.

The parameter table above the example spelled "timline" and now spells the word the function is named after.

Verification

Gate Result
verify_workbook 130 functions, 211 parts
verify_sources src reproduces all 130, every date conversion read
verify_signatures 117 signatures, 122 parameter tables, 119 example blocks
verify_previous_names 130 one-to-one against v1.2.6
verify_cache all 20,224 cached values match their formulas
excel_selftest 197 of 197, 1,129 formulas, 0 error cells

Whole-workbook cell diff against v2.4.0: five cells, all of them on the sheet that displays this function's own help.

Known and not fixed

  • nb.TimelinePositionλ's parameter table carries the same "timline" spelling.
  • nb.Allocateλ accumulates its result with HSTACK inside a REDUCE, which rebuilds the whole accumulator on every pass. It is quick at any sane input and quadratic at a large one, and nb.Depreciateλ does not check that a life in years is a life rather than a date serial, so a mistyped argument stops responding rather than returning an error.
  • nb.Amortiseλ and nb.Depreciateλ each hold their own copy of the months-per-period rounding and fail on sub-monthly timelines.
  • nb.InterestLRVλ is not cap-aware, so in the one period where the cap binds it understates the interest it reports. Balances are unaffected.
  • The repository still states no licence for its own tooling.

Asset

nabla.xlsx, 435,862 bytes, sha256 912263caa3661d1efefa59ebe0cb78414db4a283c9878fe1732b703727242fa3.