mirror of
https://github.com/typst/typst
synced 2025-05-14 04:56:26 +08:00
75 lines
1.2 KiB
XML
75 lines
1.2 KiB
XML
// Test closures.
|
|
// Ref: false
|
|
|
|
---
|
|
|
|
// Basic closure without captures.
|
|
{
|
|
let adder = (x, y) => x + y
|
|
test(adder(2, 3), 5)
|
|
}
|
|
|
|
// Pass closure as argument and return closure.
|
|
// Also uses shorthand syntax for a single argument.
|
|
{
|
|
let chain = (f, g) => (x) => f(g(x))
|
|
let f = x => x + 1
|
|
let g = x => 2 * x
|
|
let h = chain(f, g)
|
|
test(h(2), 5)
|
|
}
|
|
|
|
// Capture environment.
|
|
{
|
|
let mark = "?"
|
|
let greet = {
|
|
let hi = "Hi"
|
|
name => {
|
|
hi + ", " + name + mark
|
|
}
|
|
}
|
|
|
|
test(greet("Typst"), "Hi, Typst?")
|
|
|
|
mark = "!"
|
|
test(greet("Typst"), "Hi, Typst!")
|
|
}
|
|
|
|
// Don't leak environment.
|
|
{
|
|
// Error: 18-19 unknown variable
|
|
let func() = x
|
|
let x = "hi"
|
|
|
|
test(func(), error)
|
|
}
|
|
|
|
// Redefined variable.
|
|
{
|
|
let x = 1
|
|
let f() = {
|
|
let x = x + 2
|
|
x
|
|
}
|
|
test(f(), 3)
|
|
}
|
|
|
|
---
|
|
// Too few arguments.
|
|
{
|
|
let types(x, y) = "[" + type(x) + ", " + type(y) + "]"
|
|
test(types(14%, 12pt), "[relative, length]")
|
|
|
|
// Error: 16-22 missing argument: y
|
|
test(types("nope"), "[string, none]")
|
|
}
|
|
|
|
// Too many arguments.
|
|
{
|
|
let f(x) = x + 1
|
|
|
|
// Error: 10-15 unexpected argument
|
|
// Error: 17-24 unexpected argument
|
|
f(1, "two", () => x)
|
|
}
|