# `Statifier.Machine.Param`
[🔗](https://github.com/riddler/statifier-ex/blob/v2.0.0/lib/statifier/machine/param.ex#L1)

One compiled `<param>` element - the interned counterpart to
`Statifier.Document.Param`. A `%Param{}` is not reachable only through
`Statifier.Machine.Donedata.params`: `Statifier.Machine.Content.Send` and
`Statifier.Machine.Invoke` each own a `namelist` and a `params` list of
`Param.t()` too.

`kind` records which of `expr`/`location` the author wrote (`:expr` or
`:location`) - `Statifier.Validator.Checks.Param` already guarantees
exactly one is present, so this field is never ambiguous. Both kinds are
read through `expr`/`expr_location` today: a `<param location>` compiles
its path string the same way a `<param expr>` compiles its expression
(Decision 4), which is only sound because a bound datamodel location is
itself a legal value-producing expression in this engine's predicator
value space. `kind` is kept anyway so a later read-only location-resolve
switch (the epic's own Phase 4 mentioned in the plan) is a one-site change
in the interpreter fold, not a lowering, `Document`, or validator change.

`expr` and `expr_location` follow `Statifier.Machine.Donedata`'s own
naming for the same shape: `expr` is the compiled `Machine.expr()`,
`expr_location` is the diagnostic span for it (`attribute_locations[:expr]`
or `attribute_locations[:location]`, whichever attribute was written).

`location` is `<param>`'s own element span, mirroring
`Statifier.Document.Param`'s inverted-from-`Assign` convention (see that
module's moduledoc) - it is not a compiled path, just the node's position
in the source document.

No `c_index`: like `Statifier.Machine.Donedata.expr`, a `<param>` is not
executable content, never appears in a block, and no `execute_block` ever
runs it.

# `expr`

```elixir
@type expr() :: Statifier.Machine.expr() | {:invalid, Statifier.Compiler.Error.t()}
```

The compiled location/expression, or `{:invalid, error}` when a `namelist`
entry failed to compile. Only a `namelist` entry ever carries the deferral
arm: a `<param>` element's `expr`/`location` still fails
`Statifier.Compiler.compile/1` (see `docs/datamodel.md`'s per-element-class
policy). Spec 5.9.4 permits either timing; deferral is what lets a document
with an ill-formed `namelist` load at all, so 6.2.2's discard MUST and 6.4's
terminate MUST (ADR-0036, ADR-0031) get to run.

# `kind`

```elixir
@type kind() :: :expr | :location
```

# `t`

```elixir
@type t() :: %Statifier.Machine.Param{
  expr: expr(),
  expr_location: Statifier.Parser.Location.t(),
  kind: kind(),
  location: Statifier.Parser.Location.t(),
  name: String.t()
}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
