---
layout: ../../../layouts/DocsLayout.astro
title: Lambdas
---
import Code from "../../../components/Code.astro"

# Lambdas / Anonymous functions


## Anonymous function

<Code thpcode={`
fun(Int x, Int y) -> Int {
    x + y
}


numbers.map(fun(x) {
    x * 2
})
`} />



## Closure types

By default closures **always** capture variables as **references**.


<Code thpcode={`
var x = 20

val f = fun() {
    print(x)
}

f()     // 20

x = 30
f()     // 30
`} />


You can force a closure to capture variables by value.

<Code thpcode={`
fun(parameters) clone(variables) {
    // code
}
`} />

<Code thpcode={`
var x = 20

val f = fun() clone(x) {
    print(x)
}

f()     // 20

x = 30
f()     // 20
`} />


## Lambdas

Lambdas are a short form of anonymous functions. They are declared with `#{}`.

Inside the lambda you can access the parameters as `$1`, `$2`, etc.

Finally, lambdas be written outside of the parenthesis of function calls.

<Code thpcode={`
numbers.map() #{
    $1 * 2
}

// the above lambda is equivalent to:

numbers.map(fun(param1) {
    $1 * 2
})
`} />



