Slide 13 de 37

Casamento de padrões com is

Padrões de variante
type Shape {
	Circle    { radius: Int }
	Rectangle { width: Int, height: Int }
}

proc main(): void {
	shape := Shape.Circle(4)
	if shape is Shape.Circle(r)            { echo "círculo, r={r}" }
	else if shape is Shape.Rectangle(w, _) { echo "retângulo, w={w}" }
}
Padrões de vetor
proc main(): void {
	command := ["move", "north", "2"]
	if command is ["move", dir, ...steps] { echo "{dir}, {len(steps)} a mais" }
	else if command is ["stop"]           { echo "parar" }
}
Padrões de string
proc main(): void {
	path := "/users/42/posts/7"
	if path is "/users/{id}/posts/{postId}" { echo "{id} / {postId}" }
}
`is` verifica um valor contra um padrão e produz um Bool, estreitando-o e vinculando nomes que já podem ser usados — no resto da condição depois de &&, e no corpo do ramo. Não existe instrução match; toda combinação é uma cadeia comum de if/else if. Existem quatro tipos de padrão: uma variante, um Result, um vetor combinado posicionalmente com um ...rest opcional, e um template de string cujos {buracos} vinculam o texto entre os trechos literais.