Zum Inhalt springen
Varlig-Handbuch
Varlig-Startseite

Eigene Funktionen

Wenn du dieselbe Formel immer wieder mit anderen Zahlen tippst, mach eine Funktion daraus. Du benennst die Formel und ihre Eingaben einmal und rufst sie dann überall auf, wo du ein Ergebnis brauchst: für einen Trinkgeldrechner, einen BMI-Check, eine Sparprognose oder eine Rechnung.

Auf dieser Seite geht es darum, Funktionen zu definieren und aufzurufen, wie sie die anderen Namen in deiner Notiz nutzen, um Bedingungen und Rekursion und um die geltenden Grenzen. Für die Funktionen, die Varlig mitbringt, etwa sqrt und round, siehe die Referenz der eingebauten Funktionen.

Eine Funktion definieren und aufrufen

Schreib den Namen der Funktion, ihre Parameter in runden Klammern, ein Gleichheitszeichen und die Formel. Dann rufst du sie mit Werten in derselben Reihenfolge auf:

calc
Trinkgeld(Rechnung, Anteil) = Rechnung * Anteil
Trinkgeld(48 , 15%) ergibt €7.20
Trinkgeld(120 , 12.5%) ergibt €15.00
Trinkgeld(36 + 12 , 15%) ergibt €7.20

Die Definitionszeile zeigt kein Ergebnis. Jeder Aufruf setzt deine Werte anstelle von Rechnung und Anteil ein und berechnet die Formel. Ein Argument kann eine ganze Rechnung sein, wie 36 € + 12 € oben.

Argumente sind vollständige Werte, nicht nur Zahlen, Einheiten und Währungen wandern also durch die Formel mit:

calc
bmi(Gewicht, Größe) = Gewicht / Größe^2
bmi(81 kg, 1.8 m) ergibt 25 kg/m²

Einheiten bleiben so erhalten, wie du sie angibst, bmi(81 kg, 180 cm) antwortet also in kg/cm². Um unabhängig von der Eingabe immer dieselbe Einheit zu erhalten, rechne innerhalb der Funktion um:

calc
bmi(Gewicht, Größe) = (Gewicht / Größe^2) in kg/m^2
bmi(81 kg, 180 cm) ergibt 25 kg/m²
bmi(80 kg, 5.9 ft) ergibt 24.7375131668 kg/m²

Eine Funktion kann auch keine Parameter haben. Schreib dann leere Klammern, sowohl beim Definieren als auch beim Aufrufen:

calc
MwSt_Satz() = 19%
120 * MwSt_Satz() ergibt €22.80

Eine einfache Variable wie MwSt_Satz = 19% erfüllt meist denselben Zweck mit weniger Tipparbeit.

Namen und Parameter

  • Funktions- und Parameternamen sind einzelne Wörter. Verwende Buchstaben, Ziffern und Unterstriche, etwa netto_lohn oder bmi2, ohne Leerzeichen. Schreibst du Fläche des Kreises(r) = pi * r^2, schlägt dir die Zeile den passenden Namen vor: Fläche_des_Kreises.
  • Bei Funktionsnamen spielt die Groß- und Kleinschreibung keine Rolle: Nachdem du Trinkgeld(Rechnung, Anteil) definiert hast, kannst du trinkgeld(48 €, 15%) aufrufen.
  • Jeder Parameter braucht einen eigenen Namen. f(a, a) = a ist ein Fehler.
  • Eine Funktion kann bis zu 32 Parameter haben.
  • Den Namen einer eingebauten Funktion kannst du nicht wiederverwenden. round(x) = … oder sqrt(x) = … zeigt einen Fehler, statt sie zu ersetzen. Eine einfache Variable darf einen dieser Namen trotzdem tragen, etwa floor = 12 m²; siehe Namen.
  • Die Tabellenkalkulations-Schreibweisen avg, total und stdev sind frei. Definierst du dein eigenes total(Bestellung), wird deine Version ausgeführt.
  • Eine Funktion und eine Variable dürfen denselben Namen haben. Satz liest die Variable, Satz(5) ruft die Funktion auf.
  • Ruf eine Funktion immer mit Klammern auf. Ein Funktionsname allein, ohne gleichnamige Variable, zeigt einen Fehler.

Kommas in Argumenten

Ein Komma mit einem Leerzeichen danach trennt die Argumente, und ein Komma, auf das genau drei Ziffern folgen, gruppiert Tausender. Du kannst Beträge also wie gewohnt schreiben:

calc
Trinkgeld(Rechnung, Anteil) = Rechnung * Anteil
Trinkgeld(1,200 , 15%) ergibt €180.00
Trinkgeld(1200 ,15%) ergibt €180.00

Braucht eine Funktion mehr Werte, als die Leerzeichen ergeben, trennt jedes Komma, wie im zweiten Aufruf. Nimm für Nachkommastellen einen Dezimalpunkt, wie in Trinkgeld(48 €, 12.5%).

Andere Namen in deiner Notiz verwenden

Eine Funktion kann Variablen aus deiner Notiz verwenden. Bei jedem Aufruf liest sie deren aktuellen Wert:

calc
MwSt = 19%
mit_MwSt(Preis) = Preis * (1 + MwSt)
mit_MwSt(50 ) ergibt €59.50
MwSt = 7%
mit_MwSt(50 ) ergibt €53.50

Die Variable muss schon existieren, wenn du die Funktion definierst, setz MwSt = 19% also über mit_MwSt. Existiert sie noch nicht, zeigt die Definitionszeile einen Fehler.

Parameter gelten nur innerhalb der Funktion. Ein Parameter namens Preis liest oder ändert keine Variable namens Preis an anderer Stelle der Notiz:

calc
Preis = 10
doppelt(Preis) = Preis * 2
doppelt(3 ) ergibt €6.00
Preis ergibt €10.00

Wie Variablen kannst du eine Funktion, die in einem Rechenblock definiert ist, in späteren Rechenblöcken derselben Notiz verwenden. Varlig arbeitet die Notiz von oben nach unten ab, definiere eine Funktion also über der ersten Zeile, die sie aufruft. Ein Aufruf über der Definition zeigt kein Ergebnis.

Funktionen, die andere Funktionen aufrufen

Kleine Funktionen können aufeinander aufbauen:

calc
Tagessatz = 400
Honorar(Tage) = Tage * Tagessatz
Endbetrag(Tage) = Honorar(Tage) * 1.19
Endbetrag(5) ergibt €2,380.00

Eine Funktion merkt sich die Version einer Hilfsfunktion, die existierte, als du sie definiert hast. Definierst du dieselbe Hilfsfunktion weiter unten erneut, verwenden früher definierte Funktionen weiterhin die alte Version:

calc
Versand(Bestellung) = 4.95
Summe(Bestellung) = Bestellung + Versand(Bestellung)
Versand(Bestellung) = 2.95
Summe(30 ) ergibt €34.95
Versand(30 ) ergibt €2.95

Damit das neue Versand greift, definiere Summe darunter erneut. Wenn du eine Definition direkt an ihrer Stelle bearbeitest, passiert das nicht. Varlig berechnet die Notiz von oben neu, alles darunter verwendet also deine bearbeitete Version.

Eine Funktion kann auch eine Hilfsfunktion aufrufen, die du weiter unten definierst. Sie verwendet dann die Version, die zum Zeitpunkt des Aufrufs gilt, die Hilfsfunktion muss also existieren, wenn du die äußere Funktion aufrufst:

calc
Kasse(Bestellung) = Bestellung + Lieferung(Bestellung)
Lieferung(Bestellung) = if Bestellung >= 40 then 0 else 3.50
Kasse(25 ) ergibt €28.50
Kasse(60 ) ergibt €60.00

Bedingungen

Mit if … then … else … wählst du zwischen Ergebnissen. Für mehr als zwei Fälle hängst du nach else ein weiteres if an:

calc
Porto(Gewicht) = if Gewicht <= 100 g then 0.85 else if Gewicht <= 750 g then 1.55 else 3.20
Porto(90 g) ergibt €0.85
Porto(500 g) ergibt €1.55
Porto(1.2 kg) ergibt €3.20

Berechnet wird nur der Zweig, der zutrifft. So kannst du dich gegen eine Rechnung absichern, die sonst fehlschlagen würde, etwa eine Division durch null:

calc
pro_Person(Summe, Personen) = if Personen > 0 then Summe / Personen else 0
pro_Person(90 , 3) ergibt €30.00
pro_Person(90 , 0) ergibt €0.00

Rekursion

Eine Funktion kann sich selbst aufrufen, solange eine Bedingung sie irgendwann stoppt. Diese hier zählt die Händedrücke, wenn sich in einer Gruppe alle einmal die Hand geben:

calc
Handschläge(Personen) = if Personen <= 1 then 0 else (Personen - 1) + Handschläge(Personen - 1)
Handschläge(6) ergibt 15
Handschläge(10) ergibt 45

Jeder Aufruf geht eine Ebene tiefer, und höchstens 16 verschachtelte Aufrufe sind erlaubt. Handschläge(16) funktioniert noch, Handschläge(17) zeigt Error: calculation limit. Eine Funktion, die ihren Abbruchfall nie erreicht, wird beim Definieren akzeptiert und stößt beim Aufrufen an dieselbe Grenze. Zwei Funktionen können sich auch gegenseitig aufrufen, innerhalb derselben Grenze.

Für alltägliches Zählen sind die eingebauten Funktionen schneller und haben keine solche Grenze. combination(10, 2) ergibt ebenfalls 45, und factorial(n) oder n! deckt das klassische Rekursionsbeispiel ab.

Listen, Matrizen und mehr

Argumente können Listen, Matrizen oder komplexe Zahlen sein, und der Funktionsrumpf kann jede eingebaute Funktion verwenden:

calc
Spanne(Werte) = max(Werte) - min(Werte)
Spanne([12, 18, 9, 21]) ergibt 12

Der Rumpf kann auch eine Summe oder einen Gleichungslöser mit eigener lokaler Variable enthalten. Siehe Listen und Statistik und Summen, Gleichungen lösen und Analysis.

Stolperfallen

  • Schreib Potenzen mit ^. wird innerhalb einer Funktion nicht akzeptiert. Schlimmer noch: Ein kurzer Parametername kann einer Einheit entsprechen. In w / h² bedeutet Quadratstunden, nicht den Parameter h. Schreib w / h^2.
  • Prüf die Anzahl der Argumente. Trinkgeld(48 €) aufzurufen, wenn die Funktion zwei Werte erwartet, zeigt einen Fehler.
  • Eine Zeile, eine Formel. Eine Definition ist ein einzelner Ausdruck in einer Zeile. Für eine Rechnung mit mehreren Schritten definierst du für jeden Schritt eine kleine Funktion und kombinierst sie.
  • Eine fehlerhafte Neudefinition behält die alte Version. Enthält eine neue Definition von Trinkgeld einen Fehler, zeigt die Zeile einen Fehler, und das vorherige funktionierende Trinkgeld bleibt verfügbar.
  • Ergebnisse können sich ändern, wenn die Notiz neu berechnet wird. Aufrufe werden jedes Mal neu berechnet, eine Funktion mit random oder dem heutigen Datum kann also ein neues Ergebnis liefern.
  • Fehler werden weitergereicht. Lässt ein Argument die Formel fehlschlagen, etwa durch eine Division durch null, zeigt der Aufruf diesen Fehler.

Grenzen

Was Grenze
Parameter pro Funktion 32
Verschachtelte Aufrufe (eine Funktion ruft sich oder eine andere auf) 16
Aufrufe während der Berechnung eines einzelnen äußeren Aufrufs 16.384
In einer Notiz definierte Funktionen 1.024

Wird eine Grenze erreicht, erscheint Error: calculation limit. Der Rest der Notiz funktioniert weiter. Unter Fehler, Diagnosen und Grenzen findest du alle Grenzen.

Alles zusammen

Hier ist eine Rechnung für freiberufliche Arbeit. Tagessatz und Mehrwertsteuer stehen oben als benannte Werte, und drei kleine Funktionen erledigen die Arbeit:

calc
# Rechnung März
Tagessatz = 450
MwSt = 19%
Honorar(Tage) = Tage * Tagessatz
mit_MwSt(Betrag) = Betrag * (1 + MwSt)
Mahngebühr(Betrag, Tage_verspätet) = if Tage_verspätet > 30 then Betrag * 2% else 0
Design = Honorar(8) ergibt €3,600.00
Umsetzung = Honorar(4.5) ergibt €2,025.00
Zwischensumme = Design + Umsetzung ergibt €5,625.00
mit_MwSt(Zwischensumme) ergibt €6,693.75
Mahngebühr(mit_MwSt(Zwischensumme), 45) ergibt €133.88

Ändere Tagessatz oder MwSt, und jede Zeile darunter aktualisiert sich. Zahlt der Kunde zu spät, kommt die Gebühr mit einem einzigen Aufruf dazu.