Salta al contenuto
Guida di Varlig
Pagina iniziale di Varlig

Le tue funzioni

Se usi spesso la stessa formula con numeri diversi, trasformala in una funzione. Definisci una volta il nome, gli argomenti e la formula, poi richiamala dove serve: per una mancia, un calcolo dell’IMC, una proiezione di risparmio o una fattura.

Questa pagina spiega come definire e chiamare funzioni, come usano gli altri nomi della nota, condizioni e ricorsione, e quali limiti si applicano. Per le funzioni integrate, come sqrt e round, vedi la documentazione di riferimento delle funzioni.

Definire e chiamare una funzione

Scrivi il nome della funzione, i parametri tra parentesi, il segno uguale e la formula. Poi chiamala passando i valori nello stesso ordine:

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

La riga che definisce la funzione non mostra un risultato. Ogni chiamata sostituisce bill e pct con i valori forniti e calcola la formula. Un argomento può essere un’intera espressione, come $36 + $12 sopra.

Gli argomenti sono valori completi, non solo numeri: anche unità di misura e valute vengono quindi usate nella formula.

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

Le unità restano quelle fornite: bmi(81 kg, 180 cm) restituisce un risultato in kg/cm². Per ottenere sempre la stessa unità, effettua la conversione all’interno della funzione:

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

Una funzione può anche non avere parametri. Usa parentesi vuote sia nella definizione sia nella chiamata:

calc
standard_vat() = 20%
£120 * standard_vat() dà £24.00

Una variabile semplice, come standard_vat = 20%, di solito fa lo stesso lavoro con meno digitazione.

Nomi e parametri

  • I nomi di funzioni e parametri devono essere parole singole. Usa lettere, cifre e trattini bassi, come net_pay o bmi2, senza spazi. Se scrivi area of circle(r) = pi * r^2, la riga suggerisce il nome corretto: area_of_circle.
  • I nomi delle funzioni non distinguono maiuscole e minuscole: dopo aver definito Tip(bill, pct), puoi chiamare tip($48, 15%).
  • Ogni parametro ha bisogno del proprio nome. f(a, a) = a è un errore.
  • Una funzione può avere fino a 32 parametri.
  • Non puoi riutilizzare il nome di una funzione integrata: round(x) = … e sqrt(x) = … generano un errore invece di sostituirla. Una variabile normale può comunque usare questi nomi, per esempio floor = 12 m²: vedi Nomi.
  • I nomi tipici dei fogli di calcolo avg, total e stdev sono invece disponibili per le tue funzioni. Se definisci total(order), viene eseguita la tua versione.
  • Una funzione e una variabile possono condividere un nome. rate legge la variabile e rate(5) chiama la funzione.
  • Chiama sempre le funzioni con le parentesi. Il nome di una funzione scritto da solo, senza una variabile omonima, non mostra nulla. Fanno eccezione sum, total, subtotal, grand total, average, max e min, che calcolano la relativa statistica sulle righe precedenti: vedi Sommare le righe precedenti.

Virgole negli argomenti

Una virgola seguita da uno spazio separa gli argomenti, e una virgola seguita esattamente da tre cifre raggruppa migliaia, in modo da poter scrivere importi come faresti normalmente:

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

Se la funzione richiede più valori di quelli individuati tramite gli spazi, ogni virgola viene considerata un separatore, come nella seconda chiamata. Usa il punto per i decimali, come in tip($48, 12.5%).

Usare altri nomi nella tua nota

Una funzione può usare le variabili della nota, leggendone il valore attuale a ogni chiamata:

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

La variabile deve già esistere quando definisci la funzione, quindi metti vat = 20% sopra with_vat. Se non esiste ancora, la riga di definizione mostra un errore.

I parametri sono locali alla funzione. Un parametro chiamato price non legge o cambia una variabile chiamata price altrove nella nota:

calc
price = £10
double(price) = price * 2
double(£3) dà £6.00
price dà £10.00

Come le variabili, una funzione definita in un blocco di calcolo può essere usata nei blocchi successivi della stessa nota. Varlig elabora la nota dall’alto verso il basso: definisci quindi la funzione prima della prima chiamata. Una chiamata precedente alla definizione non mostra alcun risultato.

Funzioni che chiamano altre funzioni

Puoi combinare piccole funzioni che si richiamano a vicenda:

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

Una funzione ricorda la versione della funzione ausiliaria esistente al momento della definizione. Se ridefinisci la funzione ausiliaria più avanti nella nota, le funzioni definite prima continuano a usare la versione precedente:

calc
shipping(order) = £4.95
total(order) = order + shipping(order)
shipping(order) = £2.95
total(£30) dà £34.95
shipping(£30) dà £2.95

Per usare la nuova versione di shipping, definisci nuovamente total sotto di essa. Modificare direttamente la definizione originale non crea questo problema: Varlig ricalcola la nota dall’inizio e tutte le righe successive usano la versione modificata.

Una funzione può anche chiamare una funzione ausiliaria definita più avanti. In questo caso usa la versione disponibile al momento della chiamata: la funzione ausiliaria deve quindi esistere quando chiami quella esterna.

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

Condizioni

Usa if … then … else … per scegliere tra i risultati. Concatena un altro if dopo else per più di due casi:

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

Viene calcolato solo il ramo selezionato dalla condizione. Puoi così evitare un’operazione che altrimenti fallirebbe, come una divisione per zero:

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

Ricorsività

Una funzione può chiamare se stessa, purché una condizione finisca per interrompere la ricorsione. Questa conta le strette di mano quando ogni persona del gruppo stringe una volta la mano a ciascuna delle altre:

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

Ogni chiamata aggiunge un livello di annidamento; sono ammessi al massimo 12 livelli. handshakes(12) funziona, ma handshakes(13) mostra Error: calculation limit. Una funzione che non raggiunge mai la condizione di arresto viene accettata nella definizione, ma incontra lo stesso limite quando viene chiamata. Anche due funzioni possono chiamarsi reciprocamente, entro questo limite.

Per i conteggi comuni, le funzioni integrate sono più rapide e non hanno questo limite. Anche combination(10, 2) restituisce 45; factorial(n) o n! calcolano il classico esempio ricorsivo del fattoriale.

Elenchi, matrici e altro

Gli argomenti possono essere liste, matrici o numeri complessi e il corpo della funzione può usare qualsiasi funzione integrata:

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

Il corpo della funzione può contenere anche una sommatoria o un risolutore di equazioni con una variabile locale propria. Vedi Liste e statistiche e Sommatorie, equazioni e analisi matematica.

Insidie

  • Scrivi le potenze con ^. x² non è accettato dentro una funzione. Inoltre, un nome di parametro breve può coincidere con un’unità: in w / h², h² indica ore al quadrato, non il parametro h. Scrivi w / h^2.
  • Controlla il numero di argomenti. Chiamare tip($48) quando la funzione richiede due valori genera un errore.
  • Un prezzo senza unità viene interpretato come prezzo unitario. In oats(amount) = amount / 1 kg * £0.95, £0,95 è un prezzo al chilogrammo. Ogni chiamata lo segnala: passando il puntatore compare una spiegazione che invita a scrivere esplicitamente £0.95/kg nella funzione oats. Specificando il prezzo unitario nella definizione, l’avviso scompare.
  • Una riga, una formula. Una definizione è una singola espressione su una riga. Per un calcolo con più passaggi, definisci una piccola funzione per ogni passaggio e combinale.
  • Una ridefinizione errata conserva la versione precedente. Se una nuova definizione di tip contiene un errore, la riga lo segnala e la precedente versione funzionante di tip rimane disponibile.
  • I risultati possono cambiare quando la nota viene ricalcolata. Le chiamate vengono eseguite di nuovo ogni volta: una funzione che usa random o la data odierna può quindi dare un risultato diverso.
  • Gli errori vengono propagati. Se un argomento fa fallire la formula, per esempio causando una divisione per zero, la chiamata mostra quell’errore.

Limiti

Che cosa Limite
Parametri per funzione 32
Chiamate annidate (una funzione che chiama se stessa o un'altra) 12
Chiamate eseguite per valutare una chiamata al livello principale 16,384
Funzioni definite in una nota 1,024

Quando viene raggiunto un limite, compare Error: calculation limit. Il resto della nota continua a funzionare. L’elenco completo è in Errori, diagnostica e limiti.

Un esempio completo

Ecco una fattura per un’attività freelance. Tariffa e IVA sono definite all’inizio come valori con un nome; tre piccole funzioni eseguono i calcoli:

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) dà £3,600.00
build = fee(4.5) dà £2,025.00
subtotal = design + build dà £5,625.00
with_vat(subtotal) dà £6,750.00
late_fee(with_vat(subtotal), 45) dà £135.00

Modificando day_rate o vat si aggiornano tutte le righe successive. Se il cliente paga in ritardo, basta una chiamata per aggiungere la penale.