Files
calctext/_bmad-output/implementation-artifacts/1-3-interpreter-evaluator.md
2026-03-16 19:54:53 -04:00

2.4 KiB

epic, story, title, status
epic story title status
1 1.3 Interpreter / Evaluator draft

Epic 1 — Core Calculation Engine (Rust Crate)

Goal: Build calcpad-engine as a standalone Rust crate that powers all platforms. This is the foundation.

Story 1.3: Interpreter / Evaluator

As a CalcPad engine consumer, I want the AST evaluated into typed results with metadata, So that each line produces a meaningful, displayable calculation result.

Acceptance Criteria:

Given an AST representing 2 + 3 When the interpreter evaluates it Then it returns a CalcResult of type Number with value 5

Given an AST representing 5kg + 200g When the interpreter evaluates it Then it returns a CalcResult of type UnitValue with value 5.2 kg And the result unit matches the left-hand operand's unit

Given an AST representing $20 in EUR When the interpreter evaluates it within a context that has exchange rates loaded Then it returns a CalcResult of type CurrencyValue with the converted amount and target currency EUR

Given an AST representing today + 3 weeks When the interpreter evaluates it Then it returns a CalcResult of type DateTime with the correct future date

Given an AST representing March 12 to July 30 When the interpreter evaluates it Then it returns a CalcResult of type TimeDelta representing the duration between the two dates

Given an AST representing 5 > 3 When the interpreter evaluates it Then it returns a CalcResult of type Boolean with value true

Given an AST representing 100 - 20% When the interpreter evaluates it Then it returns a CalcResult of type Number with value 80 And the percentage is interpreted as "20% of 100" subtracted from 100

Given an AST representing $100 + 10% When the interpreter evaluates it Then it returns a CalcResult of type CurrencyValue with value $110

Given an AST with incompatible unit arithmetic such as 5kg + 3m When the interpreter evaluates it Then it returns a CalcResult of type Error with a message indicating incompatible units And the error includes the span of the offending expression

Given any evaluated result When the result is produced Then it includes metadata: the input span, the result type, display-formatted string, and raw numeric value where applicable