{"section":"tutorials","requestedLocale":"pt","requestedSlug":"glossario-de-expressoes","locale":"pt","slug":"glossario-de-expressoes","path":"docs/pt/tutorials/weni-by-vtex/fluxos/glossario-de-expressoes.md","branch":"main","content":"Expressões são fórmulas utilizadas na plataforma de forma muito semelhante às usadas em programas de planilha, como a do Microsoft Excel. Embora tenham evoluído com o tempo e essas semelhanças sejam muito menores agora. É uma linguagem de modelagem baseada em expressões que visa facilitar a geração de texto a partir de um contexto de valores.\n\nNesse artigo trataremos um pouco sobre:\n\n- Modelos\n- Tipos\n- Operadores\n- Funções\n\n## Modelos\n\nExpressões podem ser chamadas usando o seguinte modelo: `@(...)`.\n\nPor exemplo, o modelo `Hi @(\"\"Dr \"\" & upper(foo))`pega o valor da variável `@foo`, converte para maiúsculas e o prefixa com outra palavra. Observe que dentro de uma expressão complexa você não precisa colocar `@` antes de todas as variáveis.\n\n## Tipos\n\nTemos os seguintes tipos de expressões aceitos na plataforma:\nArray: usado para a criação de um array de itens:\n\n    @(array(1, \"\"x\"\", true)) → [1, x, true]\n    @(array(1, \"\"x\"\", true)[1]) → x\n    @(count(array(1, \"\"x\"\", true))) → 3\n    @(json(array(1, \"\"x\"\", true))) → [1,\"\"x\"\",true]\n\nBooleano: é um booleano `verdadeiro`ou `falso`\n\n    @(true) → true\n    @(1 = 1) → true\n    @(1 = 2) → false\n    @(json(true)) → true\n\nData: é um valor de data do calendário gregoriano\n\n    @(date_from_parts(2019, 4, 11)) → 2019-04-11@(format_date(date_from_parts(2019, 4, 11))) → 11-04-2019@(json(date_from_parts(2019, 4, 11))) → \"\"2019-04-11\"\"\n\nData e Hora: é um valor de data e hora\n\n    @(datetime(\"\"1979-07-18T10:30:45.123456Z\"\")) → 1979-07-18T10:30:45.123456Z\n    @(format_datetime(datetime(\"\"1979-07-18T10:30:45.123456Z\"\"))) → 18-07-1979 05:30@(json(datetime(\"\"1979-07-18T10:30:45.123456Z\"\"))) → \"\"1979-07-18T10:30:45.123456Z\"\"\n\nFunção: é uma função que pode ser chamada\n\n    @(upper) → function\n    @(array(upper)[0](\"\"abc\"\")) → ABC\n    @(json(upper)) → null\n\nNúmero: é um número inteiro ou fracionado\n\n    @(1234) → 1234\n    @(1234.5678) → 1234.5678\n    @(format_number(1234.5670)) → 1,234.567\n    @(json(1234.5678)) → 1234.5678\n\nObjeto: é um objeto com propriedades nomeadas\n\n    @(object(\"\"foo\"\", 1, \"\"bar\"\", \"\"x\"\")) → \\{bar: x, foo: 1\\}\n    @(object(\"\"foo\"\", 1, \"\"bar\"\", \"\"x\"\").bar) → x\n    @(object(\"\"foo\"\", 1, \"\"bar\"\", \"\"x\"\")[\"\"bar\"\"]) → x\n    @(count(object(\"\"foo\"\", 1, \"\"bar\"\", \"\"x\"\"))) → 2\n    @(json(object(\"\"foo\"\", 1, \"\"bar\"\", \"\"x\"\"))) → \\{\"\"bar\"\":\"\"x\"\",\"\"foo\"\":1\\}\n\nTexto: é uma sequência de caracteres\n\n    @(\"\"abc\"\") → abc\n    @(text_length(\"\"abc\"\")) → 3\n    @(upper(\"\"abc\"\")) → ABC\n    @(json(\"\"abc\"\")) → \"\"abc\"\"\n\nTempo: é uma hora do dia\n\n    @(time_from_parts(16, 30, 45)) → 16:30:45.000000@(format_time(time_from_parts(16, 30, 45))) → 16:30@(json(time_from_parts(16, 30, 45))) → \"\"16:30:45.000000\"\"\n\n## Operadores\n\nAbaixo, segue a lista de todos os operadores que podem ser utilizados na construção de expressões na plataforma:\n**+** : soma dois números\n\n    @(2 + 3) → 5\n    @(fields.age + 10) → 33\n\n**&** : une dois valores de texto\n\n    @(\"\"hello\"\" & \"\" \"\" & \"\"bar\"\") → hello bar\n    @(\"\"hello\"\" & null) → hello\n\n**/** : divide um número por outro\n\n    @(4 / 2) → 2@(3 / 2) → 1.5\n    @(46 / fields.age) → 2\n    @(3 / 0) → ERROR\n\n**=** : retorna \"\"true\"\" se dois valores são textualmente iguais\n\n    @(\"\"hello\"\" = \"\"hello\"\") → true\n    @(\"\"hello\"\" = \"\"bar\"\") → false\n    @(1 = 1) → true\n\n**^** : ele um número à potência de outro\n\n    @(2 ^ 8) → 256\n\n**>** : retorna \"\"true\"\" se o primeiro número for maior que o segundo\n\n    @(2 > 3) → false@(3 > 3) → false@(4 > 3) → true\n\n**> =** : retorna \"\"true\"\" se o primeiro número for maior que ou igual ao segundo\n\n    @(2 >= 3) → false\n    @(3 >= 3) → true\n    @(4 >= 3) → true\n\n**<** : retorna \"\"true\"\" se o primeiro número for menor que o segundo\n\n    @(2 < 3) → true\n    @(3 < 3) → false\n    @(4 < 3) → false\n\n**< =** : retorna \"\"true\"\" se o primeiro número for menor que ou igual ao segundo\n\n    @(2 <= 3) → true\n    @(3 <= 3) → true\n    @(4 <= 3) → false\n\n**\\*** : multiplica dois números\n\n    @(3 * 2) → 6\n    @(fields.age * 3) → 69\n\n**\\- (un ário)** : nega um número\n\n    @(-fields.age) → -23\n\n**!** : retorna \"\"true\"\" se dois valores não são textualmente iguais\n\n    @(\"\"hello\"\" != \"\"hello\"\") → false\n    @(\"\"hello\"\" != \"\"bar\"\") → true\n    @(1 != 2) → true\n\n**\\- (bin ário)** : subtrai dois números\n\n    @(3 - 2) → 1\n    @(2 - 3) → -1\n\n## Funções\n\nAs expressões têm acesso a um conjunto de funções internas que podem ser usadas para executar tarefas mais complexas. As funções são chamadas usando a sintaxe `@(function_name(args..))` e podem assumir como argumentos valores literais `@(length(split(\"\"1 2 3\"\", \"\" \"\"))`ou variáveis no contexto`@(title(contact.name)`.\n\n`abs(número)`: retorna o valor absoluto de `number`.\n\n    @(abs(-10)) → 10\n    @(abs(10.5)) → 10.5\n    @(abs(\"\"foo\"\")) → ERROR\n\n`and(valores...)`: retorna se todos os dados de `values`são verdadeiros\n\n    @(and(true)) → true\n    @(and(true, false, true)) → false\n\n`array(valores...)`: toma vários `values`e os retorna como uma matriz.\n\n    @(array(\"\"a\"\", \"\"b\"\", 356)[1]) → b\n    @(join(array(\"\"a\"\", \"\"b\"\", \"\"c\"\"), \"\"|\"\")) → a|b|c\n    @(count(array())) → 0\n    @(count(array(\"\"a\"\", \"\"b\"\"))) → 2\n\n`attachment_parts(anexo)`: analisa um anexo em suas diferentes partes\n\n    @(attachment_parts(\"\"image/jpeg:https://example.com/test.jpg\"\")) → \\{content_type: image/jpeg, url: https://example.com/test.jpg\\}\n\n`boolean(valor)`: tenta converter `value`para um booleano. Um erro será retornado se o valor não puder ser convertido.\n\n    @(boolean(array(1, 2))) → true\n    @(boolean(\"\"FALSE\"\")) → false\n    @(boolean(1 / 0)) → ERROR\n\n`char(código)`: retorna o caractere para UNICODE fornecido `code`. É o inverso do código.\n\n    @(char(33)) → !\n\n    @(char(128512)) → 😀\n    @(char(\"\"foo\"\")) → ERROR\n\n`clean(texto)`: remove todos os caracteres não imprimíveis de `text`. É o inverso de `char`.\n\n    @(clean(\"\"😃 Hello \\nwo\\tr\\rld\"\")) → 😃 Hello world\n    @(clean(123)) → 123\n\n`code(texto)`: retorna o código UNICODE para o primeiro caractere de `text`. É o inverso do `char`.\n\n    @(code(\"\"a\"\")) → 97\n    @(code(\"\"abc\"\")) → 97\n    @(code(\"\"😀\"\")) → 128512\n    @(code(\"\"15\"\")) → 49\n    @(code(15)) → 49\n    @(code(\"\"\"\")) → ERROR\n\n`count(valor)`: retorna o número de itens na matriz ou propriedades especificadas em um objeto. Ele retornará um erro se for passado um item que não é contável.\n\n    @(count(contact.fields)) → 5\n    @(count(array())) → 0\n    @(count(array(\"\"a\"\", \"\"b\"\", \"\"c\"\"))) → 3\n    @(count(1234)) → ERROR\n\n`date(valor)`: tenta converter `(valor)`para uma data. Se for texto, ele será analisado em uma data usando o formato de data padrão. Um erro será retornado se o valor não puder ser convertido.\n\n    @(date(\"\"1979-07-18\"\")) → 1979-07-18\n    @(date(\"\"1979-07-18T10:30:45.123456Z\"\")) → 1979-07-18@(date(\"\"10/05/2010\"\")) → 2010-05-10\n    @(date(\"\"NOT DATE\"\")) → ERROR\n\n`date_from_parts(ano, mês, dia)`: cria uma data de `year``month``day`.\n\n    @(date_from_parts(2017, 1, 15)) → 2017-01-15\n    @(date_from_parts(2017, 2, 31)) → 2017-03-03\n    @(date_from_parts(2017, 13, 15)) → ERROR\n\n`datetime(valor)`: tenta converter `value`para um datatime. Se for texto, ele será analisado em uma data e hora usando os formatos padrão de data e hora. Um erro será retornado se o valor não puder ser convertido.\n\n    @(datetime(\"\"1979-07-18\"\")) → 1979-07-18T00:00:00.000000-05:00@(datetime(\"\"1979-07-18T10:30:45.123456Z\"\")) → 1979-07-18T10:30:45.123456Z\n    @(datetime(\"\"10/05/2010\"\")) → 2010-05-10T00:00:00.000000-05:00\n    @(datetime(\"\"NOT DATE\"\")) → ERROR\n\n`datetime_ad (datetime, offset, unit)`: Calcula o valor da data alcançada adicionando o `offset`número de `unit`ao `datetime`. As durações válidas são \"\"Y\"\" para anos, \"\"M\"\" para meses, \"\"W\"\" para semanas, \"\"D\"\" para dias, \"\"h\"\" para horas, \"\"m\"\" para minutos e \"\"s\"\" para segundos.\n\n    @(datetime_add(\"\"2017-01-15\"\", 5, \"\"D\"\")) → 2017-01-20T00:00:00.000000-05:00\n    @(datetime_add(\"\"2017-01-15 10:45\"\", 30, \"\"m\"\")) → 2017-01-15T11:15:00.000000-05:00\n\n`datetime_diff(date1``date2``unidade)`: retorna a duração entre `date1`e `date2`no `unit`especificado. As durações válidas são \"\"Y\"\" para anos, \"\"M\"\" para meses, \"\"W\"\" para semanas, \"\"D\"\" para dias, \"\"h\"\" para horas, \"\"m\"\" para minutos e \"\"s\"\" para segundos.\n\n    @(datetime_diff(\"\"2017-01-15\"\", \"\"2017-01-17\"\", \"\"D\"\")) → 2@(datetime_diff(\"\"2017-01-15\"\", \"\"2017-05-15\"\", \"\"W\"\")) → 17@(datetime_diff(\"\"2017-01-15\"\", \"\"2017-05-15\"\", \"\"M\"\")) → 4\n    @(datetime_diff(\"\"2017-01-17 10:50\"\", \"\"2017-01-17 12:30\"\", \"\"h\"\")) → 1@(datetime_diff(\"\"2017-01-17\"\", \"\"2015-12-17\"\", \"\"Y\"\")) → -2\n\n`datetime_from_epoch(segundos)`: converte o horário da época UNIX `seconds`em uma nova data.\n\n    @(datetime_from_epoch(1497286619)) → 2017-06-12T11:56:59.000000-05:00@(datetime_from_epoch(1497286619.123456)) → 2017-06-12T11:56:59.123456-05:00\n\n`default(valor, padrão)`: retorna `value`se não estiver vazio ou com erro, caso contrário ele retornará`default`.\n\n    @(default(undeclared.var, \"\"default_value\"\")) → default_value@(default(\"\"10\"\", \"\"20\"\")) → 10\n    @(default(\"\"\"\", \"\"value\"\")) → value\n    @(default(\"\"  \"\", \"\"value\"\")) → \\x20\\x20\n    @(default(datetime(\"\"invalid-date\"\"), \"\"today\"\")) → today@(default(format_urn(\"\"invalid-urn\"\"), \"\"ok\"\")) → ok\n\n`epoch(data)`: converte `date`em um horário de época UNIX. O número retornado pode conter segundos fracionários.\n\n    @(epoch(\"\"2017-06-12T16:56:59.000000Z\"\")) → 1497286619\n    @(epoch(\"\"2017-06-12T18:56:59.000000+02:00\"\")) → 1497286619@(epoch(\"\"2017-06-12T16:56:59.123456Z\"\")) → 1497286619.123456@(round_down(epoch(\"\"2017-06-12T16:56:59.123456Z\"\"))) → 1497286619\n\n`extract(objeto, propriedades)`: pega um objeto e extrai a propriedade nomeada.\n\n    @(extract(contact, \"\"name\"\")) → Ryan Lewis\n    @(extract(contact.groups[0], \"\"name\"\")) → Testers\n\n`extract_object(objeto, propriedades...)`: pega um objeto e retorna um novo objeto extraindo apenas as propriedades nomeadas.\n\n    @(extract_object(contact.groups[0], \"\"name\"\")) → \\{name: Testers\\}\n\n`field(texto, índice, delimitador)`: divide `text`usando o dado`delimiter`e retorna o campo `index`. O índice começa em zero. Ao dividir com um espaço, o delimitador é considerado como todo o espaço em branco.\n\n    @(field(\"\"a,b,c\"\", 1, \"\",\"\")) → b\n    @(field(\"\"a,,b,c\"\", 1, \"\",\"\")) →\n    @(field(\"\"a   b c\"\", 1, \"\" \"\")) → b\n    @(field(\"\"a      b   c   d\"\", 1, \"\"    \"\")) →\n    @(field(\"\"a\\t\\tb\\tc\\td\"\", 1, \"\" \"\")) →\n    @(field(\"\"a,b,c\"\", \"\"foo\"\", \"\",\"\")) → ERROR\n\n`foreach(valores, func, [argumentos...])`: cria uma nova matriz aplicando `func`a cada valor em`values`. Se a função fornecida receber mais de um argumento, você poderá passar argumentos adicionais após a função.\n\n    @(foreach(array(\"\"a\"\", \"\"b\"\", \"\"c\"\"), upper)) → [A, B, C]@(foreach(array(\"\"the man\"\", \"\"fox\"\", \"\"jumped up\"\"), word, 0)) → [the, fox, jumped]\n\n`foreach_value(objeto, func, [args...])`: cria um novo objeto aplicando `func`a cada valor de propridade `object`. Se a função fornecida receber mais de um argumento, você poderá passar argumentos adicionais após a função.\n\n    @(foreach_value(object(\"\"a\"\", \"\"x\"\", \"\"b\"\", \"\"y\"\"), upper)) → \\{a: X, b: Y\\}@(foreach_value(object(\"\"a\"\", \"\"hi there\"\", \"\"b\"\", \"\"good bye\"\"), word, 1)) → \\{a: there, b: bye\\}\n\n`format(valor)`: formatos de `value`de acordo com seu tipo.\n\n    @(format(1234.5670)) → 1,234.567\n    @(format(now())) → 11-04-2018 13:24\n    @(format(today())) → 11-04-2018\n\n`format_date(data, [, formato])`: formata`date`como texto de acordo com o dado`format`. Se`format`não for especificado, o formato padrão do ambiente será usado. A cadeia de formato pode consistir nos seguintes caractere. Os caracteres '', ':', ',', 'T', '-' e '\\_' são ignorados. Qualquer outro caractere é um erro.\n\n- `YY`\\- últimos dois dígitos do ano 0-99\n- `YYYY`\\- quatro dígitos do ano 0000-9999\n- `M`\\- retorna o mês, sem o zero 1-12\n- `MM`\\- retorna o mês com o zero preenchido 01-12\n- `D`\\- dia do mês 1-31\n- `DD`\\- dia do mês, zero preenchido 01-31\n\n      @(format_date(\"\"1979-07-18T15:00:00.000000Z\"\")) → 18-07-1979@(format_date(\"\"1979-07-18T15:00:00.000000Z\"\", \"\"YYYY-MM-DD\"\")) → 1979-07-18@(format_date(\"\"2010-05-10T19:50:00.000000Z\"\", \"\"YYYY M DD\"\")) → 2010 5 10@(format_date(\"\"1979-07-18T15:00:00.000000Z\"\", \"\"YYYY\"\")) → 1979\n      @(format_date(\"\"1979-07-18T15:00:00.000000Z\"\", \"\"M\"\")) → 7\n      @(format_date(\"\"NOT DATE\"\", \"\"YYYY-MM-DD\"\")) → ERROR\n\n  `format_datetime (data e hora [, formato [, fuso horário]])`\n  Formata datetime como texto de acordo com o dado `format`. Se `format`não for especificado, o formato padrão do ambiente será usado. A cadeia de contato pode consistir nos seguintes caracteres. Os caracteres '', ':', ',', 'T', '-' e '\\_' são ignorados. Qualquer outro caractere é um erro.\n\n- `YY`\\- últimos dois dígitos do ano 0-99\n- `YYYY`\\- quatro dígitos do ano 0000-9999\n- `M`\\- retorna o mês, sem o zero 1-12\n- `MM`\\- retorna o mês com o zero preenchido 01-12\n- `D`\\- dia do mês 1-31\n- `DD`\\- dia do mês, zero preenchido 01-31\n- `h`\\- hora do dia 1-12\n- `hh`\\- hora do dia 01-12\n- `tt`\\- vinte de quatro horas do dia 00-23\n- `m`\\- minuto sem o zero preenchido 0-59\n- `mm`\\- minuto com o zero preenchido 00-59\n- `s`\\- segundo sem o zero preenchido 0-59\n- `ss`\\- segundo sem o zero preenchido 00-59\n- `fff`\\- milissegundos\n- `ffffff`\\- microssegundos\n- `fffffffff`\\- nanosegundos\n- `aa`\\- AM ou PM\n- `AA`\\- AM ou PM\n- `Z`\\- deslocamento de hora e minuto do UTC ou Z do UTC\n- `ZZZ`\\- deslocamento de hora e minuto do UTC\n\nO fuso horário deve ser o nome de local, conforme especificado no bando de dados do fuso horário da IANA, como \"\"\"\"America / Guayaquil\"\" ou \"\"America / Los_Angeles\"\". Se não especificado, o fuso horário atual será usado. Um erro será retornado se o fuso horário não for reconhecido.\n\n    @(format_datetime(\"\"1979-07-18T15:00:00.000000Z\"\")) → 18-07-1979 10:00@(format_datetime(\"\"1979-07-18T15:00:00.000000Z\"\", \"\"YYYY-MM-DD\"\")) → 1979-07-18\n    @(format_datetime(\"\"2010-05-10T19:50:00.000000Z\"\", \"\"YYYY M DD tt:mm\"\")) → 2010 5 10 14:50\n    @(format_datetime(\"\"2010-05-10T19:50:00.000000Z\"\", \"\"YYYY-MM-DD hh:mm AA\"\", \"\"America/Los_Angeles\"\")) → 2010-05-10 12:50 PM\n    @(format_datetime(\"\"1979-07-18T15:00:00.000000Z\"\", \"\"YYYY\"\")) → 1979@(format_datetime(\"\"1979-07-18T15:00:00.000000Z\"\", \"\"M\"\")) → 7\n    @(format_datetime(\"\"NOT DATE\"\", \"\"YYYY-MM-DD\"\")) → ERROR\n\n`format_location(local)`: formata o dado`location`como seu nome.\n\n    @(format_location(\"\"Rwanda\"\")) → Rwanda\n    @(format_location(\"\"Rwanda > Kigali\"\")) → Kigali\n\n`format_number(número, lugares [, humanizar])`: formata `number`o número decimal especificado `places`. Um terceiro argumento opcional `humanize`pode ser falso para desativar o uso de mil separadores.\n\n    @(format_number(1234)) → 1,234@(format_number(1234.5670)) → 1,234.567@(format_number(1234.5670, 2, true)) → 1,234.57@(format_number(1234.5678, 0, false)) → 1235@(format_number(\"\"foo\"\", 2, false)) → ERROR\n\n`format_time (hora, [, formato])`: formata `time`como texto de acordo com o dato `format`\n. Se `format`não for especificado, o formato padrão do ambiente será usado. A cadeia de formato pode consistir nos seguintes caracteres. Os caracteres '', ':', ',', 'T', '-' e '\\_' são ignorados. Qualquer outro caractere é um erro.\n\n- `h`\\- hora do dia 1-12\n- `hh`\\- hora do dia 01-12\n- `tt`\\- vinte de quatro horas do dia 00-23\n- `m`\\- minuto sem o zero preenchido 0-59\n- `mm`\\- minuto com zero preenchido 00-59\n- `s`\\- segundo sem o zero preenchido 0-59\n- `ss`\\- segundo com o zero preencido 00-59\n- `fff`\\- milissegundos\n- `ffffff`\\- microssegundos\n- `fffffffff`\\- nanosegundos\n- `aa`\\- AM ou PM\n- `AA`\\- AM ou PM\n\n      @(format_time(\"\"14:50:30.000000\"\")) → 14:50@(format_time(\"\"14:50:30.000000\"\", \"\"h:mm aa\"\")) → 2:50 pm@(format_time(\"\"15:00:27.000000\"\", \"\"s\"\")) → 27\n      @(format_time(\"\"NOT TIME\"\", \"\"hh:mm\"\")) → ERROR\n\n  `format_urn(urn)`: formata`urn`em texto amigável para humanos.\n\n      @(format_urn(\"\"tel:+250781234567\"\")) → 0781 234 567@(format_urn(\"\"twitter:134252511151#billy_bob\"\")) → billy_bob@(format_urn(contact.urn)) → (202) 456-1111\n      @(format_urn(urns.tel)) → (202) 456-1111\n      @(format_urn(urns.mailto)) → foo@bar.com\n      @(format_urn(\"\"NOT URN\"\")) → ERROR\n\n  `html_decode(texto)`: decodificações HTML`text`\n\n      @(html_decode(\"\"Red &amp; Blue\"\")) → Red & Blue\n      @(html_decode(\"\"5 + 10\"\")) → 5 + 10\n\n  `if (teste, valor1, valor2)`: retorna `value1`se `test`é verdade e `value2`se não. Se o primeiro argumento for um erro, esse erro será retornado.\n\n      @(if(1 = 1, \"\"foo\"\", \"\"bar\"\")) → foo\n      @(if(\"\"foo\"\" > \"\"bar\"\", \"\"foo\"\", \"\"bar\"\")) → ERROR\n\n  `is_error(valor)`: retorna se `value`tiver um erro.\n\n      @(is_error(datetime(\"\"foo\"\"))) → true\n      @(is_error(run.not.existing)) → true\n      @(is_error(\"\"hello\"\")) → false\n\n  `join(matriz, separador)`: associa o dado`array`de strings com`separator`para citar texto.\n\n      @(join(array(\"\"a\"\", \"\"b\"\", \"\"c\"\"), \"\"|\"\")) → a|b|c\n      @(join(split(\"\"a.b.c\"\", \"\".\"\"), \"\" \"\")) → a b c\n\n  `json(valor)`: retorna a representação JSON de `value`.\n\n      @(json(\"\"string\"\")) → \"\"string\"\"\n      @(json(10)) → 10\n      @(json(null)) → null\n      @(json(contact.uuid)) → \"\"5d76d86b-3bb9-4d5a-b822-c9d86f5d8e4f\"\"\n\n  `lower(texto)`: converte `text`para minúsculas.\n\n      @(lower(\"\"HellO\"\")) → hello\n      @(lower(\"\"hello\"\")) → hello\n      @(lower(\"\"123\"\")) → 123\n      @(lower(\"\"😀\"\")) → 😀\n\n  `max (números...)`: retorna o valor máximo em`numbers`.\n\n      @(max(1, 2)) → 2\n      @(max(1, -1, 10)) → 10\n      @(max(1, 10, \"\"foo\"\")) → ERROR\n\n  `mean(números...)`: retorna a média aritmética de`numbers`.\n\n      @(mean(1, 2)) → 1.5\n      @(mean(1, 2, 6)) → 3\n      @(mean(1, \"\"foo\"\")) → ERROR\n\n  `min(números...)`: retorna o valor mínimo em `numbers`.\n\n      @(min(1, 2)) → 1\n      @(min(2, 2, -10)) → -10\n      @(min(1, 2, \"\"foo\"\")) → ERROR\n\n  `mod(dividendo, divisor)`: retorna o restante da divisão de `dividend`por `divisor`.\n\n      @(mod(5, 2)) → 1\n      @(mod(4, 2)) → 0\n      @(mod(5, \"\"foo\"\")) → ERROR\n\n  `now()`: retorna a data e a hora atuais no fuso horário atual.\n\n      @(now()) → 2018-04-11T13:24:30.123456-05:00\n\n  `number(valores)`: tenta converter `value`para um número. Um erro será retornado se o valor não puder ser convertido.\n\n      @(number(10)) → 10\n      @(number(\"\"123.45000\"\")) → 123.45\n      @(number(\"\"what?\"\")) → ERROR\n\n  `object(pares...)`: pega os pares de valores do nome da propriedade e os retorna como um novo objeto.\n\n      @(object()) → \\{\\}\n      @(object(\"\"a\"\", 123, \"\"b\"\", \"\"hello\"\")) → \\{a: 123, b: hello\\}\n      @(object(\"\"a\"\")) → ERROR\n\n  `or(valores...)`: retorna se algum dos dados `values`é verdadeiro.\n\n      @(or(true)) → true\n      @(or(true, false, true)) → true\n\n  `parse_datetime(texto, formato [, fuso horário])`: analisa `text`em uma data usando o dado`format`. A cadeia de formato pode consistir nos seguintes caracteres. Os caracteres '', ':', ',', 'T', '-' e '\\_' são ignorados. Qualquer outro caractere é um erro.\n\n- `YY`\\- últimos dois dígitos do ano 0-99\n- `YYYY`\\- quatro dígitos do ano 0000-9999\n- `M`\\- mês 1-12\n- `MM`\\- mês 01-12\n- `D`\\- dia do mês sem o zero preenchido 1-31\n- `DD`\\- dia do mês, zero preenchido 01-31\n- `h`\\- hora do dia sem o zero preenchido 1-12\n- `hh`\\- hora do dia com o zero preenchido 01-12\n- `tt`\\- vinte de quatro horas do dia 00-23\n- `m`\\- minuto sem o zero preenchido 0-59\n- `mm`\\- minuto com o zero preenchido 00-59\n- `s`\\- segundo sem o zero preenchido 0-59\n- `ss`\\- segundo com o zero preenchido 00-59\n- `fff`\\- milissegundos\n- `ffffff`\\- microssegundos\n- `fffffffff`\\- nanosegundos\n- `aa`\\- AM ou PM\n- `AA`\\- AM ou PM\n- `Z`\\- deslocamento de hora e minuto do UTC ou Z do UTC\n- `ZZZ`\\- deslocamento de hora e minuto do UTC\n\nO fuso horário deve ser o nome de local, conforme especificado no bando de dados do fuso horário da IANA, como \"\"\"\"America / Guayaquil\"\" ou \"\"America / Los_Angeles\"\". Se não especificado, o fuso horário atual será usado. Um erro será retornado se o fuso horário não for reconhecido.\n\nObserve que os segundos fracionários serão analisados mesmo sem um identificador de formato explícito. Você deve especificar apenas segundos fracionários quando desejar afirmar o número de lugares no formato de entrada.\n\nparse_datetime retornará um erro se não conseguir converter o texto em uma datetime.\n\n    @(parse_datetime(\"\"1979-07-18\"\", \"\"YYYY-MM-DD\"\")) → 1979-07-18T00:00:00.000000-05:00\n    @(parse_datetime(\"\"2010 5 10\"\", \"\"YYYY M DD\"\")) → 2010-05-10T00:00:00.000000-05:00@(parse_datetime(\"\"2010 5 10 12:50\"\", \"\"YYYY M DD tt:mm\"\", \"\"America/Los_Angeles\"\")) → 2010-05-10T12:50:00.000000-07:00\n    @(parse_datetime(\"\"NOT DATE\"\", \"\"YYYY-MM-DD\"\")) → ERROR\n\n`parse_json(texto)`: tenta analisar `text`como JSON. Se o `text`JSON fornecido não for válido, será retornado um erro.\n\n    @(parse_json(\"\"\\{\\\"\"foo\\\"\": \\\"\"bar\\\"\"\\}\"\").foo) → bar\n    @(parse_json(\"\"[1,2,3,4]\"\")[2]) → 3\n    @(parse_json(\"\"invalid json\"\")) → ERROR\n\n`parse_time(texto, formato)`: analisa `text`em um tempo usando o dado`format`. A cadeia de formato pode consistir nos seguintes caracteres. Os caracteres '', ':', ',', 'T', '-' e '\\_' são ignorados. Qualquer outro caractere é um erro.\n\n- `h`\\- hora do dia 1-12\n- `hh`\\- hora do dia 01-12\n- `tt`\\- vinte de quatro horas do dia 00-23\n- `m`\\- minuto sem o zero preenchido 0-59\n- `mm`\\- minuto com o zero preenchido 00-59\n- `s`\\- segundo sem o zero preenchido 0-59\n- `ss`\\- segundo com o zero preenchido 00-59\n- `fff`\\- milissegundos\n- `ffffff`\\- microssegundos\n- `fffffffff`\\- nanosegundos\n- `aa`\\- AM ou PM\n- `AA`\\- AM ou PM\n\nObserve que os segundos fracionários serão analisados mesmo sem um identificador de formato explícito. Você deve especificar apenas segundos fracionários quando desejar afirmar o número de lugares no formato de entrada.\n\nparse_time retornará um erro se não conseguir converter o texto em uma datetime.\n\n    @(parse_time(\"\"15:28\"\", \"\"tt:mm\"\")) → 15:28:00.000000\n    @(parse_time(\"\"2:40 pm\"\", \"\"h:mm aa\"\")) → 14:40:00.000000\n    @(parse_time(\"\"NOT TIME\"\", \"\"tt:mm\"\")) → ERROR\n\n`percent(número)`: formatos`number`como uma porcentagem.\n\n    @(percent(0.54234)) → 54%\n    @(percent(1.2)) → 120%\n    @(percent(\"\"foo\"\")) → ERROR\n\n`rand()`: retorna um único número aleatório entre [0,0-1,0).\n\n    @(rand()) → 0.607552015674623913099594574305228888988494873046875@(rand()) → 0.484677570947340263796121462291921488940715789794921875\n\n`rand_between()`: um único inteiro aleatório no intervalo inclusivo fornecido.\n\n    @(rand_between(1, 10)) → 10\n    @(rand_between(1, 10)) → 2\n\n`read_chars(texto)`: converte `text`em algo que pode ser lido pelos sistemas de URA. O ReadChars dividirá os números como eles são mais fáceis de entender. Isso inclui a divisão em 3s ou 4s, se apropriado.\n\n    @(read_chars(\"\"1234\"\")) → 1 2 3 4\n    @(read_chars(\"\"abc\"\")) → a b c\n    @(read_chars(\"\"abcdef\"\")) → a b c , d e f\n\n`regex_match(texto, padrão [, grupo])`: retorna a primeira correspondência da expressão regular`pattern`em`text`. Um terceiro parâmetro opcional `group`determina qual grupo correspondente será retornado.\n\n    @(regex_match(\"\"sda34dfddg67\"\", \"\"\\d+\"\")) → 34\n    @(regex_match(\"\"Bob Smith\"\", \"\"(\\w+) (\\w+)\"\", 1)) → Bob\n    @(regex_match(\"\"Bob Smith\"\", \"\"(\\w+) (\\w+)\"\", 2)) → Smith\n    @(regex_match(\"\"Bob Smith\"\", \"\"(\\w+) (\\w+)\"\", 5)) → ERROR\n    @(regex_match(\"\"abc\"\", \"\"[\\.\"\")) → ERROR\n\n`remove_first_word(texto)`: remove a primeira palavra de `text`.\n\n    @(remove_first_word(\"\"foo bar\"\")) → bar\n    @(remove_first_word(\"\"Hi there. I'm a flow!\"\")) → there. I'm a flow!\n\n`repeat(texto, contagem)`: retorna o número `text`repetido `count`de vezes.\n\n    @(repeat(\"\"*\"\", 8)) → ********\n    @(repeat(\"\"*\"\", \"\"foo\"\")) → ERROR\n\n`replace(texto, agulha, substituição [, contagem])`: substitui até as `count`ocorrências de `needle`com `replacement`em `text`. Se`count`for omitido ou for menor que 0, todas as ocorrências serão substituídas.\n\n    @(replace(\"\"foo bar foo\"\", \"\"foo\"\", \"\"zap\"\")) → zap bar zap\n    @(replace(\"\"foo bar foo\"\", \"\"foo\"\", \"\"zap\"\", 1)) → zap bar foo\n    @(replace(\"\"foo bar\"\", \"\"baz\"\", \"\"zap\"\")) → foo bar\n\n`replace_time(datetime)`: retorna um novo datetime com a parte do tempo substituída por`time`.\n\n    @(replace_time(now(), \"\"10:30\"\")) → 2018-04-11T10:30:00.000000-05:00@(replace_time(\"\"2017-01-15\"\", \"\"10:30\"\")) → 2017-01-15T10:30:00.000000-05:00@(replace_time(\"\"foo\"\", \"\"10:30\"\")) → ERROR\n\n`round(número [, lugares])`: arredonda `number`para o valor mais próximo. Opcionalmente, você pode passar o número de casas decimais para arredondar para as`places`. Se `places`<0, arredondará a parte inteira para os 10^ mais próximos (- lugares).\n\n    @(round(12)) → 12\n    @(round(12.141)) → 12\n    @(round(12.6)) → 13\n    @(round(12.141, 2)) → 12.14\n    @(round(12.146, 2)) → 12.15\n    @(round(12.146, -1)) → 10\n    @(round(\"\"notnum\"\", 2)) → ERROR\n\n`round_down(número [, lugares])`: arredonda `number`para baixo até o valor inteiro mais próximo. Opcionalmente, você pode passar o número de casas decimais para arredondar para as `places`.\n\n    @(round_down(12)) → 12\n    @(round_down(12.141)) → 12\n    @(round_down(12.6)) → 12\n    @(round_down(12.141, 2)) → 12.14\n    @(round_down(12.146, 2)) → 12.14\n    @(round_down(\"\"foo\"\")) → ERROR\n\n`round_up(número [, lugares])`: arredonda `number`para o valor inteiro mais próximo. Opcionalmente, você pode passar o número de casas decimais para arredondar para as `places`.\n\n    @(round_up(12)) → 12\n    @(round_up(12.141)) → 13\n    @(round_up(12.6)) → 13\n    @(round_up(12.141, 2)) → 12.15\n    @(round_up(12.146, 2)) → 12.15\n    @(round_up(\"\"foo\"\")) → ERROR\n\n`split(texto, [, delimitadores])`: divide `text`em uma matriz de palavras separadas. Valores vazios são removidos da lista retornada. Há um parâmetro final opcional, `delimiters` que é uma sequência de caracteres usada para dividir o texto em palavras.\n\n    @(split(\"\"a b c\"\")) → [a, b, c]\n    @(split(\"\"a\"\", \"\" \"\")) → [a]\n    @(split(\"\"abc..d\"\", \"\".\"\")) → [abc, d]\n    @(split(\"\"a.b.c.\"\", \"\".\"\")) → [a, b, c]\n    @(split(\"\"a|b,c  d\"\", \"\" .|,\"\")) → [a, b, c, d]\n\n`text(valor)`: tenta converter `value`em texto. Um erro será retornado se o valor não puder ser convertido.\n\n    @(text(3 = 3)) → true\n    @(json(text(123.45))) → \"\"123.45\"\"\n    @(text(1 / 0)) → ERROR\n\n`text_compare(texto1, texto2)`: retorna a ordem do dicionário de `text1`e `text2`. O valor retornado será -1 se `text1`vier antes de `text2`, 0 se eles forem iguais e 1 se `text1`vier depois de `text2`.\n\n    @(text_compare(\"\"abc\"\", \"\"abc\"\")) → 0\n    @(text_compare(\"\"abc\"\", \"\"def\"\")) → -1\n    @(text_compare(\"\"zzz\"\", \"\"aaa\"\")) → 1\n\n`text_length(valor)`: retorna o comprimento (numero de caracteres) de `value`quando convertido em texto.\n\n    @(text_length(\"\"abc\"\")) → 3\n    @(text_length(array(2, 3))) → 6\n\n`text_slice(texto, início [, fim])`: retorna a parte`text`entre `start`(inclusive) e `end`(exclusivo). Se `end`não for especificado, todo o restante `text`será incluído. Valores negativos para `start`ou `end`começam no final de `text`.\n\n    @(text_slice(\"\"hello\"\", 2)) → llo\n    @(text_slice(\"\"hello\"\", 1, 3)) → el\n    @(text_slice(\"\"hello😁\"\", -3, -1)) → lo\n    @(text_slice(\"\"hello\"\", 7)) →\n\n`time(valor do tempo)`: tenta converter `value`para um horário. Se for um texto, ele será analisado em um horário usando o formato de horário padrão. Um erro será retornado se o valor não puder ser convertido.\n\n    @(time(\"\"10:30\"\")) → 10:30:00.000000\n    @(time(\"\"10:30:45 PM\"\")) → 22:30:45.000000\n    @(time(datetime(\"\"1979-07-18T10:30:45.123456Z\"\"))) → 10:30:45.123456\n    @(time(\"\"what?\"\")) → ERROR\n\n`time_from_parts(hora, minuto, segundo)`: cria um tempo de `hour`, `minute`e `second`.\n\n    @(time_from_parts(14, 40, 15)) → 14:40:15.000000\n    @(time_from_parts(8, 10, 0)) → 08:10:00.000000\n    @(time_from_parts(25, 0, 0)) → ERROR\n\n`title(texto)`: coloca em maiúscula cada palavra em `text`\n\n    @(title(\"\"foo\"\")) → Foo\n    @(title(\"\"ryan lewis\"\")) → Ryan Lewis\n    @(title(\"\"RYAN LEWIS\"\")) → Ryan Lewis\n    @(title(123)) → 123\n\n`today()`: retorna a data atual no fuso horário do ambiente.\n\n    @(today()) → 2018-04-11\n\n`trim(texto, [, caracteres])`: remove o espaço em branco de qualquer extremidade de `text`. Há um parâmetro opcional, `chars`que é uma sequência de caracteres a serem removidas em vez do espaço em branco.\n\n    @(trim(\"\" hello world    \"\")) → hello world\n    @(trim(\"\"+123157568\"\", \"\"+\"\")) → 123157568\n\n`trim_left(``texto, [, caracteres])`: remove o espaço em branco desde o início do `text`. Há um parâmetro opcional, `chars`que é uma sequência de caracteres a serem removidas em vez do espaço em branco.\n\n    @(\"\"*\"\" & trim_left(\"\" hello world   \"\") & \"\"*\"\") → *hello world   *@(trim_left(\"\"+12345+\"\", \"\"+\"\")) → 12345+\n\n`trim_right(``texto, [, caracteres])`: remove o espaço em branco do final de `text`. Há um parâmetro opcional, `chars`que é uma sequência de caracteres a serem removidas em vez do espaço em branco.\n\n    @(\"\"*\"\" & trim_right(\"\" hello world   \"\") & \"\"*\"\") → * hello world*@(trim_right(\"\"+12345+\"\", \"\"+\"\")) → +12345\n\n`tz(``data)`: retorna o nome do fuso horário de `date`. Se nenhuma informação de fuso horário estiver presente na data, o fuso horário atual será retornado.\n\n    @(tz(\"\"2017-01-15T02:15:18.123456Z\"\")) → UTC\n    @(tz(\"\"2017-01-15 02:15:18PM\"\")) → America/Guayaquil\n    @(tz(\"\"2017-01-15\"\")) → America/Guayaquil\n    @(tz(\"\"foo\"\")) → ERROR\n\n`tz_offset(``data)`: retorna o deslocamento do fuso horário de `date`. O deslocamento é retornado no formato `[+/-]HH:MM`. Se nenhuma informação de fuso horário estiver presente na data, o fuso horário atual será retornado.\n\n    @(tz_offset(\"\"2017-01-15T02:15:18.123456Z\"\")) → +0000\n    @(tz_offset(\"\"2017-01-15 02:15:18PM\"\")) → -0500\n    @(tz_offset(\"\"2017-01-15\"\")) → -0500\n    @(tz_offset(\"\"foo\"\")) → ERROR\n\n`upper(texto)`: converte `text`em maiúsculas.\n\n    @(upper(\"\"Asdf\"\")) → ASDF\n    @(upper(123)) → 123\n\n`url_encode(texto)`: codifica `text` para uso como um parâmetro de URL.\n\n    @(url_encode(\"\"two & words\"\")) → two%20%26%20words\n    @(url_encode(10)) → 10\n\n`url_parts(urn)`: analisa uma URL em suas diferentes partes.\n\n    @(urn_parts(\"\"tel:+593979012345\"\")) → \\{display: , path: +593979012345, scheme: tel\\}\n    @(urn_parts(\"\"twitterid:3263621177#bobby\"\")) → \\{display: bobby, path: 3263621177, scheme: twitterid\\}@(urn_parts(\"\"not a urn\"\")) → ERROR\n\n`week_number(data)`: retorna o número da semana (1-54) de `date`.\n\n    @(week_number(\"\"2019-01-01\"\")) → 1\n    @(week_number(\"\"2019-07-23T16:56:59.000000Z\"\")) → 30\n    @(week_number(\"\"xx\"\")) → ERROR\n\n`weekday(data)`: retorna o dia da semana para `date`. Considera-se que a semana começa no domingo; portanto, um domingo retorna 0, uma segunda-feira retorna 1, etc.\n\n    @(weekday(\"\"2017-01-15\"\")) → 0\n    @(weekday(\"\"foo\"\")) → ERROR\n\n`word(texto, índice [, delimitadores])`: retorna a palavra `index`em `text`. Os índices começam em zero. Há um parâmetro opcional, `delimiters`que é uma sequência de caracteres usada para dividir o texto em palavras.\n\n    @(word(\"\"bee cat dog\"\", 0)) → bee\n    @(word(\"\"bee.cat,dog\"\", 0)) → bee\n    @(word(\"\"bee.cat,dog\"\", 1)) → cat\n    @(word(\"\"bee.cat,dog\"\", 2)) → dog\n    @(word(\"\"bee.cat,dog\"\", -1)) → dog\n    @(word(\"\"bee.cat,dog\"\", -2)) → cat\n    @(word(\"\"bee.*cat,dog\"\", 1, \"\".*=|\"\")) → cat,dog\n    @(word(\"\"O'Grady O'Flaggerty\"\", 1, \"\" \"\")) → O'Flaggerty\n\n`word_count(``texto, [, delimitadores])`: retorna o número de palavras em `text`. Há um parâmetro opcional, `delimiters`que é uma sequência de caracteres usada para dividir o texto em palavras.\n\n    @(word_count(\"\"foo bar\"\")) → 2\n    @(word_count(10)) → 1\n    @(word_count(\"\"\"\")) → 0\n    @(word_count(\"\"😀😃😄😁\"\")) → 4\n    @(word_count(\"\"bee.*cat,dog\"\", \"\".*=|\"\")) → 2\n    @(word_count(\"\"O'Grady O'Flaggerty\"\", \"\" \"\")) → 2\n\n`word_slice(``texto, início, fim [, delimitadores])`: extrai uma sub-sequência de palavras de `text`. As palavras retornadas são aquelas que até incluem `start`, mas não incluem `end`\n. Os índices começam em zero e um valor final negativo significa que todas as palavras após o início devem ser retornadas. Há um parâmetro opcional, `delimiters`que é uma sequência de caracteres usada para dividir o texto em palavras.\n\n    @(word_slice(\"\"bee cat dog\"\", 0, 1)) → bee\n    @(word_slice(\"\"bee cat dog\"\", 0, 2)) → bee cat\n    @(word_slice(\"\"bee cat dog\"\", 1, -1)) → cat dog\n    @(word_slice(\"\"bee cat dog\"\", 1)) → cat dog\n    @(word_slice(\"\"bee cat dog\"\", 2, 3)) → dog\n    @(word_slice(\"\"bee cat dog\"\", 3, 10)) →\n    @(word_slice(\"\"bee.*cat,dog\"\", 1, -1, \"\".*=|,\"\")) → cat dog\n    @(word_slice(\"\"O'Grady O'Flaggerty\"\", 1, 2, \"\" \"\")) → O'Flaggerty"}