--- id: kw-let name: let category: structure kind: keyword tokens: let sig: let name = value tip: An immutable binding — the default choice for a value that never changes. order: 7 --- A let introduces an immutable binding: once set, reassigning it (`name = …`) is a compile error. Reach for `let` by default and only switch to `var` when a value genuinely needs to change — it makes intent obvious and catches accidental writes. Immutability is of the binding, not the object it points at: a `let` that holds a property record or a slice still lets you mutate through it (`node.current = 5`), it just cannot be repointed at a different object. Bindings inside a body are locals scoped to their block. ```ludic program Damage { property Health { current: int = 100, maximum: int = 100 } model Enemy { Health } handler Boot phase Start { spawn Grunt { Health { current: 40 } } } handler ApplyHit phase Update { let incoming_damage = 12 for (health) in query [Health, {Enemy}] { let survivor = health.current - incoming_damage health.current = survivor } } } ```