Pular para o conteúdo
Guia do Varlig
Página inicial do Varlig

Suas próprias funções

Quando você repete uma fórmula com valores diferentes, transforme-a em uma função. Defina uma vez o nome da fórmula e seus parâmetros, depois chame-a onde precisar: para calcular gorjetas, conferir o IMC, projetar investimentos ou montar uma fatura.

Esta página cobre funções de definição e chamada, como elas usam os outros nomes em sua nota, condições e recursão e os limites que se aplicam. Para as funções que vêm com Varlig, como sqrt e round, consulte a referência de função interna.

Definindo e chamando uma função

Escreva o nome da função, seus parâmetros entre parênteses, um sinal de igual e a fórmula. Em seguida, chame-o com valores na mesma ordem:

calc
tip(bill, pct) = bill * pct
tip($48, 15%) resulta em $7.20
tip($120, 12.5%) resulta em $15.00
tip($36 + $12, 15%) resulta em $7.20

A linha de definição não mostra resposta. Cada chamada coloca seus valores no lugar de bill e pct e trabalha a fórmula. Um argumento pode ser um cálculo completo, como $36 + $12 acima.

Os argumentos são valores completos, não apenas números; unidades e moedas são preservadas ao longo da fórmula:

calc
bmi(weight, height) = weight / height^2
bmi(81 kg, 1.8 m) resulta em 25 kg/m²

As unidades são mantidas como você as dá, então bmi(81 kg, 180 cm) responde em kg/cm². Para obter a mesma unidade, o que quer que você passe, converta dentro da função:

calc
bmi(weight, height) = (weight / height^2) in kg/m^2
bmi(81 kg, 180 cm) resulta em 25 kg/m²
bmi(80 kg, 5.9 ft) resulta em 24.7375131668 kg/m²

Uma função também pode não ter parâmetros. Escreva parênteses vazios ao defini-lo e ao chamá-lo:

calc
standard_vat() = 20%
£120 * standard_vat() resulta em £24.00

Uma variável simples, como standard_vat = 20%, geralmente faz o mesmo trabalho com menos digitação.

Nomes e parâmetros

  • Nomes de funções e parâmetros são palavras únicas. Use letras, dígitos e sublinhados, como net_pay ou bmi2 sem espaços. Se você escrever area of circle(r) = pi * r^2 a linha sugere o nome a ser usado em vez disso: area_of_circle.
  • Nomes de funções não diferenciam maiúsculas de minúsculas: após definir Tip(bill, pct), você pode chamar tip($48, 15%).
  • Cada parâmetro precisa de seu próprio nome. f(a, a) = a é um erro.
  • Uma função pode ter até 32 parâmetros.
  • Não é possível reutilizar o nome de uma função integrada. round(x) = … ou sqrt(x) = … produz erro em vez de substituí-la. Uma variável simples ainda pode usar esses nomes, como em floor = 12 m²; veja Nomes.
  • Os nomes comuns em planilhas avg, total e stdev estão disponíveis para funções próprias. Se você definir total(order), será a sua versão que será executada.
  • Uma função e uma variável podem compartilhar um nome. rate lê a variável e rate(5) chama a função.
  • Sempre chame uma função com parênteses. Um nome de função sozinho, sem uma variável de mesmo nome, não mostra resultado. As exceções são sum, total, subtotal, grand total, average, max e min, que calculam o valor correspondente para as linhas acima; veja Somar as linhas anteriores.

Vírgulas nos argumentos

Uma vírgula seguida por um espaço separa os argumentos, e uma vírgula seguida por exatamente três dígitos agrupa milhares, para que você possa escrever valores da maneira que normalmente faria:

calc
tip(bill, pct) = bill * pct
tip($1,200, 15%) resulta em $180.00
tip($1200,15%) resulta em $180.00

Quando a função precisa de mais valores do que os separados por vírgula e espaço, todas as vírgulas passam a separar argumentos, como na segunda chamada. Use ponto como separador decimal, como em tip($48, 12.5%).

Usando outros nomes em sua nota

Uma função pode usar variáveis da sua nota. Ele lê seu valor atual toda vez que você o chama:

calc
vat = 20%
with_vat(price) = price * (1 + vat)
with_vat(£50) resulta em £60.00
vat = 5%
with_vat(£50) resulta em £52.50

A variável já deve existir quando você definir a função, então coloque vat = 20% acima de with_vat. Se ainda não existir, a linha de definição mostra um erro.

Os parâmetros são locais para a função. Um parâmetro chamado price não lê ou altera uma variável chamada price em outra parte da nota:

calc
price = £10
double(price) = price * 2
double(£3) resulta em £6.00
price resulta em £10.00

Assim como as variáveis, uma função definida em um bloco de cálculo pode ser usada em blocos de cálculo posteriores na mesma nota. Varlig trabalha através da nota de cima para baixo, então defina uma função acima da primeira linha que a chama. Uma chamada acima da definição não mostra resposta.

Funções que chamam outras funções

Pequenas funções podem se basear umas nas outras:

calc
day_rate = £400
fee(days) = days * day_rate
invoice(days) = fee(days) * 1.2
invoice(5) resulta em £2,400.00

Uma função lembra a versão de um auxiliar que existia quando você a definiu. Se você definir o mesmo auxiliar novamente mais abaixo, as funções definidas anteriormente continuarão usando a versão antiga:

calc
shipping(order) = £4.95
total(order) = order + shipping(order)
shipping(order) = £2.95
total(£30) resulta em £34.95
shipping(£30) resulta em £2.95

Para pegar o novo shipping, defina total novamente abaixo dele. Editar uma definição no lugar não causa isso. Varlig recalcula a nota do topo, então tudo abaixo usa sua versão editada.

Uma função também pode chamar uma função auxiliar definida mais abaixo. Nesse caso, usa a versão da auxiliar disponível no momento da chamada; portanto, a auxiliar precisa existir quando você chamar a função externa:

calc
checkout(order) = order + delivery(order)
delivery(order) = if order >= £40 then £0 else £3.50
checkout(£25) resulta em £28.50
checkout(£60) resulta em £60.00

Condições

Use if … then … else … para escolher entre os resultados. Encadear outro if depois de else para mais de dois casos:

calc
postage(weight) = if weight <= 100 g then £0.85 else if weight <= 750 g then £1.55 else £3.20
postage(90 g) resulta em £0.85
postage(500 g) resulta em £1.55
postage(1.2 kg) resulta em £3.20

Apenas o ramo que se aplica é trabalhado. Isso permite que você se proteja contra um cálculo que, de outra forma, falharia, como dividir por zero:

calc
per_person(total, people) = if people > 0 then total / people else £0
per_person(£90, 3) resulta em £30.00
per_person(£90, 0) resulta em £0.00

Recursão

Uma função pode se chamar, desde que uma condição eventualmente a pare. Este conta os apertos de mão quando todos em um grupo apertam as mãos uma vez:

calc
handshakes(people) = if people <= 1 then 0 else (people - 1) + handshakes(people - 1)
handshakes(6) resulta em 15
handshakes(10) resulta em 45

Cada chamada fica um nível mais profunda e, no máximo, 12 chamadas aninhadas são permitidas. handshakes(12) ainda funciona, mas handshakes(13) mostra Error: calculation limit. Uma função que nunca atinge seu caso de parada é aceita quando você a define e atinge o mesmo limite quando você a chama. Duas funções também podem se chamar, dentro do mesmo limite.

Para a contagem diária, as funções internas são mais rápidas e não têm esse limite. combination(10, 2) também dá 45, e factorial(n) ou n!, cobre o exemplo recursivo clássico.

Listas, matrizes e mais

Argumentos podem ser listas, matrizes ou números complexos, e um corpo pode usar qualquer função interna:

calc
spread(scores) = max(scores) - min(scores)
spread([12, 18, 9, 21]) resulta em 12

O corpo da função também pode conter um somatório ou uma função de resolução de equações com sua própria variável local. Veja Listas e estatísticas e Somatórios, resolução de equações e cálculo.

Armadilhas

  • Escreva potências com ^. x² não é aceito dentro de uma função. Além disso, um parâmetro curto pode coincidir com uma unidade: em w / h², h² significa horas ao quadrado, não o parâmetro h. Escreva w / h^2.
  • Confira a quantidade de argumentos. Chamar tip($48) quando a função espera dois valores produz erro.
  • Um preço sem unidade explícita pode ser interpretado como preço por unidade. Em oats(amount) = amount / 1 kg * £0.95, £0.95 é um preço por quilograma. Cada chamada avisa isso; passe o ponteiro sobre ela para ver: "£0.95 em oats foi tratado como preço por kg. Escreva £0.95/kg para tornar isso explícito." Informar a unidade do preço na definição remove esse aviso.
  • Uma linha, uma fórmula. Uma definição é uma única expressão em uma linha. Para um cálculo com várias etapas, defina uma pequena função para cada etapa e combine-as.
  • Uma redefinição com erro preserva a versão anterior. Se a nova definição de tip tiver um erro, a linha o informa e a versão anterior válida de tip continua disponível.
  • Os resultados podem mudar quando a nota é recalculada. Cada chamada é calculada novamente. Por isso, uma função que usa random ou a data de hoje pode retornar outro resultado.
  • Erros chegam. Se um argumento faz com que a fórmula falhe, como dividir por zero, a chamada mostra esse erro.

Limites

O que Limite
Parâmetros por função 32
Chamadas aninhadas (uma função chamando a si mesma ou outra) 12
Chamadas realizadas durante a avaliação de uma chamada de nível superior 16,384
Funções definidas em uma nota 1,024

Atingir um limite mostra Error: calculation limit. O resto da nota continua funcionando. Consulte Erros, diagnósticos e limites para cada limite.

Combinando os recursos

Aqui está uma fatura freelance. A taxa e o IVA estão no topo como valores nomeados, e três pequenas funções fazem o trabalho:

calc
# March invoice
day_rate = £450
vat = 20%
fee(days) = days * day_rate
with_vat(amount) = amount * (1 + vat)
late_fee(amount, days_late) = if days_late > 30 then amount * 2% else £0
design = fee(8) resulta em £3,600.00
build = fee(4.5) resulta em £2,025.00
subtotal = design + build resulta em £5,625.00
with_vat(subtotal) resulta em £6,750.00
late_fee(with_vat(subtotal), 45) resulta em £135.00

Altere day_rate ou vat para atualizar todas as linhas abaixo. Se o cliente pagar com atraso, uma chamada de função acrescenta a taxa.