Functions
Basic syntax
In Squiggle, function definitions are treated as values. There's no explicit return
statement; the result of the last expression in the function body is returned.
If you need to define local variables in functions, you can use blocks. The last expression in the block is the value of the block:
Anonymous Functions
In Squiggle, you can define anonymous functions using the {|...| ...}
syntax. For example, myMultiply(x, y) = x * y
and myMultiply = {|x, y| x * y}
are equivalent.
Squiggle functions are first-class values, meaning you can assign them to variables, pass them as arguments to other functions, and return them from other functions.
Function Visualization
The Squiggle viewer can automatically visualize functions that take a single number as input and return either a number or a distribution, without the need for manual plots:
(number) => number
(number) => distribution
When Squiggle visualizes a function, it automatically selects a range of input values to use. The default range of input values is 0 to 10.
You can manually set the range in the following ways:
- With
Plot.numericFn
orPlot.distFn
plots, using thexScale
parameter - Through the chart's settings in the UI (look for a gear icon next to the variable name)
- With parameter annotations (explained below)
Parameter Annotations
Function parameters can be annotated with domains to specify the range of valid input values.
Examples:
x: Number.rangeDomain(5, 10)
x: [5, 10]
— shortcut forNumber.rangeDomain(...)
Annotations help to document possible values that can be passed as a parameter's value.
Annotations will affect the parameter range used in the function's chart. For more control over function charts, you can use the Plot module API.
Domains are checked on function calls; f(x: [1,2]) = x; f(3)
will fail.
We plan to support other kinds of domains in the future; for now, only numeric ranges are supported.
Annotation Reflection
Domains and parameter names can be accessed by the fn.parameters
property.