## 1.3 Static Values

Static values are infinite constant streams made of a value and they
are introduced with the construction `let static`

. Static values
are usefull to define parameterised systems. For example:

let static m = 100.0
let static g = 9.81
let static mg = m *. g
val mg : float
val mg :: static

A static value is distinguished from the other by its clock: the
clock static means that the value can be computed once for
all at instantiation time, before the execution starts.

It is possible to impose that the input of a function be a static
value. For example:

let node integr (static dt) x0 dx = x where
rec x = x0 -> pre x +. dx *. dt
val integr : float -> float => float
val integr :: static -> ’a -> ’a

The definition of a static value is valid if the right-hand part of
the definition is a constant stream. In the present version of the
compiler, a stream is said to be constant when it is both
combinatorial and its clock can be fully generalized.

A static expression is thus not necessarily an immediate constant. It
can be any combinatorial expression which only depend on other static
expressions. This is why the following program is rejected:

let node wrong x0 dt =
integr (0.0 -> 1.0) x0 dt
File "tutorial.ls", line 15, characters 10-20:
> integr (0.0 -> 1.0) x0 dt
> ^^^^^^^^^^
This expression has clock ’b,
but is used with clock static.