Lizard - Skriptsprache für symbolische Berechnungen, beliebig große und genaue Zahlen, Parallel-Computing und mehr

Anwendungen, Tools, Userlibs und anderes nützliches.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Lizard - Skriptsprache für symbolische Berechnungen und

Beitrag von Nino »

Hallo Stargåte,

vielen Dank für Deine Erklärungen. Ich verstehe das jetzt besser.

Vielen Dank auch für die Verbesserung meiner Mixed()-Funktion.
Lizard ist so mächtig und flexibel, ich habe das Gefühl man kann damit fast alles machen ... die Frage ist nur, wie. :-) Zumindest bei mir dauert es doch ein bisschen, sich mit dieser Art der Programmierung und den vielen Möglichkeiten vertraut zu machen.

Mir ist noch ein kleiner Tippfehler in der Dokumentation aufgefallen:
Divide (/)
Syntax
Divide(exp1, exp2)
exp1 - exp2
divides expression exp1 by exp2.
Es muss wohl "exp1 / exp2" heißen.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Lizard - Skriptsprache für symbolische Berechnungen und

Beitrag von Nino »

<OT>
Stargåte,

mit welcher Software hast Du denn eigentlich diese schöne Dokumentation gemacht? Du hast doch bestimmt nicht den HTML-Quelltext manuell in Notepad eingetippt, oder? :-)
</OT>
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Lizard - Skriptsprache für symbolische Berechnungen und

Beitrag von STARGÅTE »

Nino hat geschrieben:Es muss wohl "exp1 / exp2" heißen.
:oops: Ups. Korrigiert.
Nino hat geschrieben:Mit welcher Software hast Du denn eigentlich diese schöne Dokumentation gemacht?
:twisted: Vorab, ich bin so froh, dass es den CSS-Selector :target gibt. Der ermöglicht es nämlich genau nur ein section-Elemente zu zeigen, und alle andere zu verstecken, und ermöglicht so die gesamte Dokumentation in eine HTML zu quetschen. Mal gucken, wie lange das die Browser mitmachen. Infos hier
Die HTML wird natürlich generiert. Den Generator habe ich mit PB geschrieben und die Dokumentationsseiten habe ich in einer Art Wiki-Syntax aufgebaut, Beispiel hier mit Syntax-Hervorhebung in Notepad++. Naja und der Generator tut halt das "übrige", mit regulären Ausdrücken die Tags lesen, in passenden HTML-Code umwandeln, Links setzen, die Beispielcodes in Lizard ausführen und das Ergebnis in die Docu schreiben.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Lizard - Skriptsprache für symbolische Berechnungen und

Beitrag von Nino »

Danke für die Hintergrundinformationen. Interessant und :allright:
STARGÅTE hat geschrieben: :twisted: Vorab, ich bin so froh, dass es den CSS-Selector :target gibt. Der ermöglicht es nämlich genau nur ein section-Elemente zu zeigen, und alle andere zu verstecken, und ermöglicht so die gesamte Dokumentation in eine HTML zu quetschen. Mal gucken, wie lange das die Browser mitmachen. Infos hier
Ich kannte das nicht und war entsprechend verblüfft. :-)
Ist aber cool.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Lizard - Skriptsprache für symbolische Berechnungen und

Beitrag von Nino »

So kann ich meine gemischten Zahlen einfach wieder in Brüche konvertieren:

Code: Alles auswählen

Lizard kernel has been initialized.
Kernel version: 0.3.8-0003

In(1)   :=  ToFraction(m??) := m[1]+m[2]

In(2)   :=  ToFraction({3, 1/3})
Out(2)   =  10/3

In(3)   :=  ToFraction({0, 2/3})
Out(3)   =  2/3

In(4)   :=  ToFraction({-3, -1/3})
Out(4)   =  -10/3
Wenn ich bei der Definition der Funktion ToFraction() hinter dem Parameter nur ein Fragezeichen statt zweien schreibe

Code: Alles auswählen

In(1)   :=  ToFraction(m?) := m[1]+m[2]
arbeitet die Funktion anscheinend auch korrekt.

So wie ich die Lizard-Dokumentation zu "Any" und "AnySequence" verstanden habe, ist beides richtig, oder? Ich nehme an es ist besser hier ?? zu benutzen, weil Lizard so an der Stelle prüft, ob eine Sequenz übergeben wurde.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Lizard - Skriptsprache für symbolische Berechnungen und

Beitrag von STARGÅTE »

An dieser Stelle "ToFraction(m??) := m[1]+m[2]" ist das ?? fehl am Platz, ? reicht hier.
Die Nachstellung von ? bedeutet, dass der Platzhalter genau ein Argument aufnimmt.
Die Nachstellung von ?? bedeutet, dass der Platzhalter ein oder mehr Argument aufnimmt.
Im zweiten Fall würde der Platzhalter dann eine Sequence()-Ausdruck werden, um ihn zu benutzen.

Wann ist das nützlich? Zum Beispiel hier, für die Definition eines Mittelwerts, der aber ausdrücklich eine Liste verlangt:

Code: Alles auswählen

Mean( { x?? } ) := Plus(x)/Length({x})
Wenn ich nun Mean({1,2,3}) aufrufe, belegt die Mustererkennung das "x" mit "1,2,3" und ersetzt es dementsprechend im hinteren Ausdruck, der dann zu Plus(1,2,3)/Length({1,2,3}) wird, also 6/3 = 2.
Anderes Beispiel wäre, Max() mit beliebig vielen Argumenten:

Code: Alles auswählen

Max( x?? ) := Sort({x})[-1]
Wenn ich nun Max(1,2,-3) aufrufe, wird "x" mit "1,2,-3" belegt und ergibt somit: Sort({1,2,-3})[-1] wobei [-1] dann das letzte Element nach der Sortierung zurück gibt, also 2.
(Natürlich bräuchte ich nicht alles sortieren, aber das ist ja nur ein Beispiel)

Btw: Sequence ist nicht gleichbedeutend mit einer Liste, falls das gerade im Kopf schwirrt.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Lizard - Skriptsprache für symbolische Berechnungen und

Beitrag von Nino »

Hallo Stargåte,

ich danke Dir einmal mehr für Deine ausführlichen Erklärungen!
STARGÅTE hat geschrieben:Btw: Sequence ist nicht gleichbedeutend mit einer Liste, falls das gerade im Kopf schwirrt.
Ja, das schwirte. :-) Deshalb hatte ich wohl das Verständnisproblem.
Wahrscheinlich hatte ich das gleichgesetzt, weil ich früher viel in Euphoria programmiert habe. Da wird {…} als Sequence bezeichnet.
STARGÅTE hat geschrieben:

Code: Alles auswählen

Mean( { x?? } ) := Plus(x)/Length({x})
Wenn ich es richtig verstehe behandelt hier Plus() das Argument von Mean() als Sequence, und Length() behandelt es wegen {} als Liste. Das ist logisch und effektiv, aber man muss ertmal lernen sich in solch eine "Hochpräzisionssyntax" :-) hineinzudenken.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Lizard - Skriptsprache für symbolische Berechnungen und

Beitrag von STARGÅTE »

Während ich gerade an einem Update arbeite, was u.a. auch den x86 Support anbietet,
möchte ich kurz noch mal zwei Features hervorheben:
  • Verarbeitung von Doubles in Lizard ist genügsamer
    In vielen Programmiersprachen machen Doubles hin und wieder Probleme beim Vergleich untereinander, was durch ihre Darstellungsform im 2-er System zu Begründen ist.
    Das führt dazu, dass folgende Sachen in Pure Basic (oder anderswo) für "Unverständnis" sorgt:

    Code: Alles auswählen

    Define x.d, a.d, b.d, I.i
    
    a.d = 0.4
    b.d = 1.2
    
    If a*3 = b
    	Debug "0.4*3 = 1.2"
    Else
    	Debug "0.4*3 <> 1.2, höö?"
    	Debug a*3
    EndIf
    
    a = 0.9
    x = 0.0
    For I = 1 To 10
    	x + a
    Next
    
    If x = 9.0
    	Debug "0.9*10 = 9.0"
    Else
    	Debug "0.9*10 <> 9.0, höö?"
    	Debug x
    EndIf
    Lizard hingegen führt den Vergleich von Doubles nicht mit allen Bits durch und erlaubt Gleichheit auch bei Zahlen bei denen sich die letzten 6 Bits der Mantisse unterscheiden:

    Code: Alles auswählen

    In(1)   :=  a=0.4 ; b=1.2 ; a*3 == b
    Out(1)   =  True
    
    In(2)   :=  a=0.9 ; x=0.0 ; Table(x=x+a, 10) ; x == 9.0
    Out(2)   =  True
    Die Doubles sind in Lizard aber nicht ungenauer, sondern werden nur als ungenau bei Vergleichen behandelt.

    _
  • Verarbeitung von Zeichenketten mit Unicodezeichen über $FFFF:
    Während Pure Basic und selbst das Forum hier Probleme mit (ober besser gesagt Limitiert sind bei) der Verarbeitung von Zeichen über $FFFF haben, wie z.B. der Notenschlüssel, durch die Stringlängen falsch werden oder Mid() nicht richtig funktioniert:

    Code: Alles auswählen

    Define *Buffer = AllocateMemory(11)
    Base64Decoder("w6TigqzwnYSeeQ==", *Buffer, 10)  ; Base64 codierter String, weil das Forum sonst streikt.
    Define String.s = PeekS(*Buffer, -1, #PB_UTF8)  ; 4 Zeichen: ä € [Notenschlüssel] y
    
    Debug String
    Debug Len(String) ; Sollte 4 sein, ist aber 5
    Debug Mid(String, 4, 1) ; Sollte das y sein, gibt aber murks
    
    So hat Lizard keine derartigen Probleme und verarbeitet die gesamten Unicode Schichten richtig:

    Code: Alles auswählen

    Lizard::SetString("s", String)
    
    Debug Lizard::Evaluate("Length(s)") ; Ergibt 4
    Debug Lizard::Evaluate("s[4]") ; Ergibt das y
    
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Lizard - Skriptsprache für symbolische Berechnungen und

Beitrag von Nino »

Hallo Stargåte,

Du hast an so vieles gedacht ... und ich wage nicht mir vorzustellen, wie viel Arbeit Du da reingesteckt hast. Lizard erweitert PureBasics Möglichkeiten beträchtlich :!:

Für den Moment noch eine Frage. Du schriebst zuvor

Code: Alles auswählen

Factorial(n?Integer) := Apply(Times, Table(i, {i, n}))
[...]

die Definitionsvorschrift erlaubt nur ganze Zahlen für n in Factorial(n)
Geht das auch mit List als Datentyp für den Parameter?
Das folgende funktioniert offenbar, aber ich weiß nicht ob das offiziell vorgesehen ist:

Code: Alles auswählen

Lizard::Evaluate("ToFraction(m?List) := m[1] + m[2]")
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Lizard - Skriptsprache für symbolische Berechnungen und

Beitrag von STARGÅTE »

Es gibt eine neue Version, welche nun auch die x86 Prozessoren unterstützt.
Außerdem ein paar neue Funktionen und zwei neue erweiterte Beispiele zur Implementierung in Pure Basic.

Download:
Lizard - Symbolic computation script language (Version 0.3.8-0012, x64 and x86, Windows)

ChangeLog
  • 0.3.8-0012: x86 Unterstützung, Kleine Bug-fixes, zwei neue erweiterte Beispiele zur Implementierung in Pure Basic, Neue Lizard-Funktionen: Floor, Ceil, Trunc, Order

Nino hat geschrieben:Geht das auch mit List als Datentyp für den Parameter?
Das folgende funktioniert offenbar, aber ich weiß nicht ob das offiziell vorgesehen ist:
Jap, ist so vorgesehen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten