// Test code blocks. // Ref: false --- // Ref: true // Evaluates to join of none, [My ] and the two loop bodies. { let parts = ("my fri", "end.") [Hello, ] for s in parts [{s}] } // Evaluates to join of the content and strings. { [How] if true { " are" } [ ] if false [Nope] [you] + "?" } --- // Nothing evaluates to none. #test({}, none) // Let evaluates to none. #test({ let v = 0 }, none) // Evaluates to single expression. #test({ "hello" }, "hello") // Evaluates to string. #test({ let x = "m"; x + "y" }, "my") // Evaluated to int. #test({ let x = 1 let y = 2 x + y }, 3) // String is joined with trailing none, evaluates to string. #test({ type("") none }, "string") --- // Some things can't be joined. { [A] // Error: 3-4 cannot join content with integer 1 [B] } --- // Block directly in markup also creates a scope. { let x = 1 } // Error: 7-8 unknown variable #test(x, 1) --- // Block in expression does create a scope. #let a = { let b = 1 b } #test(a, 1) // Error: 2-3 unknown variable {b} --- // Double block creates a scope. {{ import b from "target.typ" test(b, 1) }} // Error: 2-3 unknown variable {b} --- // Multiple nested scopes. { let a = "a1" { let a = "a2" { test(a, "a2") let a = "a3" test(a, "a3") } test(a, "a2") } test(a, "a1") } --- // Content blocks also create a scope. [#let x = 1] // Error: 2-3 unknown variable {x} --- // Multiple unseparated expressions in one line. // Error: 2-4 invalid number suffix {1u} // Should output `1`. // Error: 3 expected semicolon or line break {1 2} // Should output `2`. // Error: 12 expected semicolon or line break // Error: 22 expected semicolon or line break {let x = -1 let y = 3 x + y} // Should output `3`. { // Error: 7-10 expected identifier, found string for "v" // Error: 8 expected keyword `in` for v let z = 1 + 2 z } --- // Error: 2 expected closing brace { --- // Error: 1-2 unexpected closing brace }