Expressões
Expressão é uma linguagem de expressões que consiste nas funções fornecidas pelo Excel com alguns acréscimos.
Assim como as funções, as expressões podem ser usadas diretamente nos cards.
Sintaxe das expressões
As expressões podem ser referenciadas diretamente no código, mas precisam ser prefixadas com @
quando usadas dentro de strings. Quando usadas dentro de strings, também é possível definir um bloco de expressão @()
, dentro do qual as expressões podem ser usadas sem o prefixo @
.
Os nomes de funções e variáveis não diferenciam maiúsculas de minúsculas, portanto UPPER
é equivalente a upper
.
O exemplo a seguir mostra três maneiras diferentes de usar expressões para concatenar strings:
card First, then: Second do
a = "pizza"
b = "cheese"
# Referencia as expressões diretamente
result = concatenate(a, " with ", b)
# Envia "Tonight we have pizza with cheese"
text("Tonight we have @result")
end
card Second, then: Third do
a = "pizza"
b = "cheese"
# Referencia as expressões em um bloco @() dentro de uma string
# Envia "Tonight we have pizza with cheese"
text("Tonight we have @(concatenate(a, \" with \", b))")
end
card Third do
a = "pizza"
b = "cheese"
# Referencia as expressões dentro de uma string
# Envia "Tonight we have pizza with cheese"
text("Tonight we have @a with @b")
end
Respostas dinâmicas
Aqui está um exemplo que usa uma expressão para responder com o nome do contato em forma capitalizada:
card Card do
text("Hello @PROPER(contact.name)")
end
Aqui está um exemplo de Quiz de Matemática que usa expressões para gerar números aleatórios e verificar a resposta.
card Calculator, "try again!", then: Answer do
calculator_number_1 = rand_between(1, 10)
calculator_number_2 = rand_between(1, 10)
ask("What is @calculator_number_1 * @calculator_number_2 ?")
end
card Answer when calculator == calculator_number_1 * calculator_number_2, then: Calculator do
buttons([Calculator]) do
text("That is correct!")
end
end
card Answer, then: Calculator do
buttons([Calculator]) do
text("""
@calculator is incorrect, the correct answer is:
@(calculator_number_1 * calculator_number_2)
""")
end
end
Botões dinâmicos
Voltando ao nosso exemplo de mensagem com botões. Suponha que o conjunto de opções para os botões não seja conhecido antecipadamente; é possível gerar as opções dinamicamente usando expressões conforme este exemplo.
Você notará que o resultado final é o mesmo do exemplo anterior, mas estamos percorrendo uma lista chamada options
, que tem o valor ["one", "two", "three"]
.
O operador &
neste exemplo indica uma função anônima e &1
é o primeiro argumento fornecido à função anônima. Consulte a referência para mais detalhes.
card Card do
button_picked = buttons(ButtonPicked, map(options, &[&1, concatenate("Option ", &1)]))
text("pick an option!")
end
card ButtonPicked do
text("You selected @button_picked")
end
Referência
Há uma longa lista de Expressões disponíveis. Você pode encontrar todas aqui
A seguir estão algumas das expressões mais usadas.
abs()
Retorna o valor absoluto de um número.
card MyCard do
# Envia "The absolute value of -1 is 1"
text("The absolute value of -1 is @abs(-1)")
end
and()
Retorna true
se e somente se todos os seus argumentos forem avaliados como true
.
concatenate()
Une strings de texto em uma única string de texto.
card MyCard do
a = "Hi"
b = "and"
c = "welcome!"
text = concatenate(a, " ", b, " ", c)
# Envia "Hi and welcome!"
text("@text")
end
filter()
Filtra uma lista, isto é, retorna apenas os elementos para os quais a expressão fornecida retorna um valor verdadeiro (truthy).
A expressão deve ser precedida pelo caractere &
, e o item atual da lista sendo avaliado pela expressão
está disponível com o placeholder &1
:
card MyCard do
items = ["apple ", "bank ", "app ", "office ", "appointment "]
# Envia "apple app appointment"
text("@filter(items, &has_beginning(&1, \"app\"))")
end
find()
Encontra o primeiro elemento da lista para o qual a expressão fornecida é verdadeira (truthy).
A expressão deve ser precedida pelo caractere &
, e o item atual da lista sendo avaliado pela expressão
está disponível com o placeholder &1
:
card MyCard do
items = [["Hello", "World"], ["Hi", "World"]]
# O resultado é ["Hi", "World"]
result = find(items, & &1[0] == "Hi")
# Envia "Hi"
text("@result[0]")
end
first_word()
Retorna a primeira palavra de uma string
card MyCard do
input = "One Two Three Four"
# Envia "One"
text("@first_word(input)")
end
fixed()
Formata o número fornecido em formato decimal usando ponto e vírgulas.
card MyCard do
result = 4.209922
# Envia "The result is 4.21"
text("The result is @fixed(4.209922, 2)")
end
has_beginning()
card MyCard do
text = "The Quick Brown Fox"
start = "the quick"
# Envia "true"
text("@has_beginning(text, start)")
end
isbool()
Retorna true
se o argumento for um booleano.
card MyCard do
a = "a"
# Envia "false"
text("@isbool(a)")
end
isnumber()
Retorna true
se o argumento for um número.
card MyCard do
a = 32
# Envia "true"
text("@isnumber(a)")
end
isstring()
Retorna true
se o argumento for uma string.
card MyCard do
a = "Hey!"
# Envia "true"
text("@isstring(a)")
end
left()
Retorna os primeiros caracteres de uma string de texto. É seguro para Unicode.
card MyCard do
text = "The quick brown fox"
# Envia "The q"
text("@left(text, 5)")
end
lower()
Converte uma string de texto para minúsculas.
card MyCard do
text = "HELLO!"
# Envia "hello!"
text("@lower(text)")
end
map()
Retorna uma lista onde cada elemento é o resultado da invocação da expressão fornecida em cada elemento correspondente da lista fornecida.
A expressão deve ser precedida pelo caractere &
, e o item atual da lista sendo avaliado pela expressão
está disponível com o placeholder &1
:
card MyCard do
items = ["a", "b", "c"]
# Envia "ABC"
text("@map(items, &upper(&1))")
end
reduce()
Reduz elementos de uma lista aplicando uma função e coletando os resultados em um acumulador.
A expressão deve ser precedida pelo caractere &
. O item atual da lista sendo avaliado pela expressão
está disponível com o placeholder &1
e o acumulador está disponível com o placeholder &2
:
card MyCard do
# Envia 6
text("@reduce(1..3, 0, & &1 + &2)")
end
reject()
Rejeita itens de uma lista, isto é, retorna apenas os elementos para os quais a expressão fornecida retorna um valor falso.
A expressão deve ser precedida pelo caractere &
, e o item atual da lista sendo avaliado pela expressão
está disponível com o placeholder &1
:
card MyCard do
items = ["apple ", "bank ", "app ", "office ", "appointment "]
# Envia "bank office"
text("@reject(items, &has_beginning(&1, \"app\"))")
end
uniq()
Remove valores duplicados de uma lista.
card MyCard do
items = ["A", "B", "B", "C"]
# O resultado é ["A", "B", "C"]
result = uniq(items)
end
upper()
Converte uma string de texto em MAIÚSCULAS.
card MyCard do
text = "hello!"
# Envia "HELLO!"
text("@upper(text)")
end
with_index()
Envolve cada item da lista em uma nova lista com o item em si e seu índice na lista original.
card MyCard do
items = ["A", "B", "C"]
# O resultado é [["A", 0], ["B", 1], ["C", 1]]
result = with_index(items)
end