Hallo Leute,
nachdem ich in meinen anderen Projekten wieder ins Stocken gekommen bin, habe ich mal wieder an
Lizard weiter gearbeitet.
Daher kann ich euch das nächste große Update vorzustellen:
________________________________________
Lizard - Symbolic computation script language (Version 0.4.2-0001)
Beinhaltet die Lizard.dll (Windows x64 und x86), die Lizard.so (Linux x64), die Lizard.pbi, einige Beispiele zur Einbindung in Pure Basic und eine ausführliche Dokumentation zu
Lizard mit vielen Beispielen.
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Es gibt einige Neuigkeiten:
- Zu aller erst habe ich ein paar Funktionen umbenannt wie es u.A. von Nino vorgeschlagen wurde. So ist Set nun Define, SetDelayed ist nun DefineDelayed und Table ist nun Iterate.
- Danach habe ich die Mustererkennungsroutine (die alleine knapp 1000 Zeilen Code hat) nahezu komplett neu geschrieben, um so eine Vielzahl von Bugs zu beseitigen die sich im "alten" Code nicht mehr fixen ließen.
- Es gibt eine ganze Reihe neuer Funktionen, vor allem mathematischer Natur, wie die Vervollständigung der trigonometrischen und hyperbolischen Funktionen, Expand, Fibonacci und Binomial, mehr Funktionen für komplexe Zahlen wie Conjugate, Im oder Re, Konstanten wie EulerMascheroni oder GoldenRatio sowie Funktionen zum Arbeiten mit Mengen wie Union oder Intersection.
- Zu guter Letzt habe ich auch zwei Funktionen hinzugefügt, SubDefine und SubDefineDelayed, die eine etwas andere Art der Zuweisung vornehmen, was die Überladung von Built-In Operatoren ermöglicht, erleichtert und optimiert, wie ich im folgenden Darstellen möchte.
Nehmen wir mal an, ihr wolltet eine spezielle Art von Zahlen mit Fehler implementieren in der Art:
approx(
Zahl,
Fehler) also z.B. approx(2.0, 0.3) was soviel bedeutet wie 2.0 ± 0.3
Natürlich möchte man gerne mit diesen spezielle Zahlen dann auch rechnen können und dabei natürlich die built-in Operatoren wie
+ und
* nutzen können ohne eigene Funktionen zu definieren.
Der erste Ansatz wäre, die Addition so zu definieren:
Code: Alles auswählen
In(1) := approx(x?, dx?) + approx(y?, dy?) := approx(x+y, dx+dy)
Dieser Ansatz hat jedoch zwei Probleme: Zum einen würde ein Hinweis kommen, dass
Plus geschützt ist (was man theoretisch noch umgehen könnte). Zum anderen würde aber eine solche Definition im Symbol
Plus registriert werden. Somit würde sie bei
jeder beliebigen Addition (selbst ohne approx-Zahlen) geprüft werden, was bei mehreren solcher Definitionen zu einer built-in Funktion schnell zu Performanceverlusten führen kann.
Die neuen Funktionen
SubDefine (@=) und
SubDefineDelayed (@:=) bieten nun die Möglichkeit solche Art von Definitionen
den Argumenten zuzuordnen, also im oberen Fall zu
approx statt zu
Plus.
approx ist nicht geschützt und die Definitionen für
approx werden bei einer Addition auch nur getestet, wenn es auch approx Elemente in der Addition gibt. In der Praxis sieht das dann so aus (was natürlich beliebig um weitere Operatoren erweitert werden kann):
Code: Alles auswählen
In(1) := approx(x?, dx?) + approx(y?, dy?) @:= approx(x+y, dx+dy)
Code: Alles auswählen
In(2) := approx(2.0, 0.3) + approx(1.0, 0.1) + approx(4.0, 0.2)
Out(2) = approx(7.0, 0.6)
Mit diesem Tool können nur recht einfach Zusatzpakete geschrieben werden, wie oben approx für fehlerbehaftete Werte oder aber ein Paket um mit Datums- und Zeitangaben zu rechnen und vieles mehr. Das vollständige Beispiel für "approx" habe ich als Beispiel mit in den Download gesteckt.
Viel spaß beim Testen und über Feedback würde ich mich wie immer freuen.