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:
Trinkgeld(Rechnung, Anteil) = Rechnung * AnteilTrinkgeld(48 €, 15%) ergibt €7.20Trinkgeld(120 €, 12.5%) ergibt €15.00Trinkgeld(36 € + 12 €, 15%) ergibt €7.20Die 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:
bmi(Gewicht, Größe) = Gewicht / Größe^2bmi(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:
bmi(Gewicht, Größe) = (Gewicht / Größe^2) in kg/m^2bmi(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:
MwSt_Satz() = 19%120 € * MwSt_Satz() ergibt €22.80Eine 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_lohnoderbmi2, ohne Leerzeichen. Schreibst duFlä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 dutrinkgeld(48 €, 15%)aufrufen. - Jeder Parameter braucht einen eigenen Namen.
f(a, a) = aist ein Fehler. - Eine Funktion kann bis zu 32 Parameter haben.
- Den Namen einer eingebauten Funktion kannst du nicht wiederverwenden.
round(x) = …odersqrt(x) = …zeigt einen Fehler, statt sie zu ersetzen. Eine einfache Variable darf einen dieser Namen trotzdem tragen, etwafloor = 12 m²; siehe Namen. - Die Tabellenkalkulations-Schreibweisen
avg,totalundstdevsind frei. Definierst du dein eigenestotal(Bestellung), wird deine Version ausgeführt. - Eine Funktion und eine Variable dürfen denselben Namen haben.
Satzliest 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:
Trinkgeld(Rechnung, Anteil) = Rechnung * AnteilTrinkgeld(1,200 €, 15%) ergibt €180.00Trinkgeld(1200 €,15%) ergibt €180.00Braucht 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:
MwSt = 19%mit_MwSt(Preis) = Preis * (1 + MwSt)mit_MwSt(50 €) ergibt €59.50MwSt = 7%mit_MwSt(50 €) ergibt €53.50Die 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:
Preis = 10 €doppelt(Preis) = Preis * 2doppelt(3 €) ergibt €6.00Preis ergibt €10.00Wie 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:
Tagessatz = 400 €Honorar(Tage) = Tage * TagessatzEndbetrag(Tage) = Honorar(Tage) * 1.19Endbetrag(5) ergibt €2,380.00Eine 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:
Versand(Bestellung) = 4.95 €Summe(Bestellung) = Bestellung + Versand(Bestellung)Versand(Bestellung) = 2.95 €Summe(30 €) ergibt €34.95Versand(30 €) ergibt €2.95Damit 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:
Kasse(Bestellung) = Bestellung + Lieferung(Bestellung)Lieferung(Bestellung) = if Bestellung >= 40 € then 0 € else 3.50 €Kasse(25 €) ergibt €28.50Kasse(60 €) ergibt €60.00Bedingungen
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:
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.85Porto(500 g) ergibt €1.55Porto(1.2 kg) ergibt €3.20Berechnet wird nur der Zweig, der zutrifft. So kannst du dich gegen eine Rechnung absichern, die sonst fehlschlagen würde, etwa eine Division durch null:
pro_Person(Summe, Personen) = if Personen > 0 then Summe / Personen else 0 €pro_Person(90 €, 3) ergibt €30.00pro_Person(90 €, 0) ergibt €0.00Rekursion
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:
Handschläge(Personen) = if Personen <= 1 then 0 else (Personen - 1) + Handschläge(Personen - 1)Handschläge(6) ergibt 15Handschläge(10) ergibt 45Jeder 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:
Spanne(Werte) = max(Werte) - min(Werte)Spanne([12, 18, 9, 21]) ergibt 12Der 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
^.x²wird innerhalb einer Funktion nicht akzeptiert. Schlimmer noch: Ein kurzer Parametername kann einer Einheit entsprechen. Inw / h²bedeuteth²Quadratstunden, nicht den Parameterh. Schreibw / 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
Trinkgeldeinen Fehler, zeigt die Zeile einen Fehler, und das vorherige funktionierendeTrinkgeldbleibt verfügbar. - Ergebnisse können sich ändern, wenn die Notiz neu berechnet wird. Aufrufe werden jedes Mal neu berechnet, eine Funktion mit
randomoder 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:
# Rechnung MärzTagessatz = 450 €MwSt = 19%Honorar(Tage) = Tage * Tagessatzmit_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.00Umsetzung = Honorar(4.5) ergibt €2,025.00Zwischensumme = Design + Umsetzung ergibt €5,625.00mit_MwSt(Zwischensumme) ergibt €6,693.75Mahngebü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.