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:

  1. (number) => number
  2. (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 or Plot.distFn plots, using the xScale 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.


  • x: Number.rangeDomain(5, 10)
  • x: [5, 10] — shortcut for Number.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.