Navigation

_internal

fx.tc.eval._internal: cross-part evaluator helpers reachable from sibling parts via the self-fixpoint; not part of the stable consumer surface.

mkCanonAppVF

mkCanonAppVF: value-level constructor for canon-app id params body-as-tagged-VDescCon — currying-applies body to params and stamps the result with _canonRef = { id; params; } so conv/quote short-circuit on the canonical identity instead of forcing .D.

mkCanonAppVF : Int -> String -> [Val] -> Val -> Val

Generic counterpart of mkDescDescAppVF for user-registered canonical descriptions. bodyVal is expected to be a curried chain of VLams that, after applying every element of paramVals, yields a VDescCon. The raw result's .D/.i/.d fields are reused; the _canonRef stamp takes precedence in conv and quote so the recursive .D slot is never forced.

Throws if the curried application does not produce a VDescCon — the smart-form's static contract.

mkDescDescAppVF

mkDescDescAppVF: value-level constructor for descDesc I L-as-tagged-VDescCon — builds the tagged shell before forcing the recursively computed fields so conv/quote can recognise the canonical reference without descending into the strong-levitation spiral.

mkDescDescAppVF : Int -> Val -> Val -> Val

Returns a VDescCon whose _canonRef = { id = "descDesc"; I; L; } marker lets conv/quote treat the value opaquely. Eliminators (descView, vInterpDF, ...) walk through descViewF's one-step semantic view of the same reference rather than forcing .D directly.

The underlying raw value is descDescVal I L evaluated via vAppF; its fields are reused but the canonical marker takes precedence in conv and quote. This separation enables sharing a single descDesc value across every recursive position in the kernel without re-evaluating the spiral.