3 Punkte von GN⁺ 2025-05-18 | Noch keine Kommentare. | Auf WhatsApp teilen
  • Mystical ist eine Notation, die PostScript-Programme als kreisförmige Strukturen zeichnet, die wie magische Kreise aussehen; in der Dokumentation wird es wie eine Sprache behandelt, tatsächlich ist es aber eher eine visuelle Darstellung von PostScript
  • Die Kernstruktur ist der Ring, wobei ausführbare Arrays {}, nicht-ausführbare Arrays [] und Dictionaries << >> durch Umrandungen, Sterne, Dreiecke und Vielecke unterschieden werden
  • Text am Rand des Rings und Sigillen verwandeln PostScript-Operatoren, Variablen, Schlüsselwörter, Strings und Namen in symbolische oder verzierte Formen
  • mystical.ps rendert Arrays, ausführbare Arrays und Dictionaries als Mystical-Bilder, und mystify.py umhüllt PostScript-Programme mit einer 8 Zoll breiten Mystical-Zeichnung auf einer 8.5x11-Seite und wandelt auch Kommentare um
  • Derzeit gibt es keinen Interpreter, der Mystical-Bilder liest und berechnet; Menschen können die Bilder jedoch in PostScript zurückübersetzen und ausführen

Eine Notation, die PostScript wie einen magischen Kreis zeichnet

  • Mystical entstand aus dem Ziel, eine Programmiersprache zu erschaffen, die einem magischen Kreis ähnelt
  • Tatsächlich ist es eher eine Methode, PostScript so zu schreiben oder zu zeichnen, dass es wie ein magischer Kreis aussieht
  • Installations- und Einführungsdokumente werden separat bereitgestellt

Ringbasierte Struktur

  • Mystical-Programme bestehen aus Ringen
  • Ein Ring ist ein kreisförmiges Band mit innerem und äußerem Rand, in dem Text und Sigillen angeordnet sind
  • Der Inhalt des Hauptrings beginnt ganz rechts, also auf 3 Uhr, und verläuft gegen den Uhrzeigersinn
    • Das folgt dem Winkelsystem von PostScript und spiegelt auch die Annahme wider, dass der Ring von außen beschrieben wird
  • Unterringe beginnen an dem Punkt, an dem sie mit der Struktur verbunden sind, die sie aufgerufen hat
  • Drei Ringtypen

    • Ausführbare Arrays entsprechen in PostScript { }; sie haben innen und außen einfache kreisförmige Umrandungen und enthalten im Inneren eine Sternform
    • Anfangs- und Endpunkt ausführbarer Arrays werden mit einem Symbol markiert, das vom alchemistischen Zeichen für „Werk vollendet“ abgeleitet ist
    • Nicht-ausführbare Arrays entsprechen in PostScript [ ]; sie ähneln ausführbaren Arrays, haben aber keine Sternform
    • Anfangs- und Endpunkte nicht-ausführbarer Arrays werden mit einfachen Dreiecken markiert
    • Dictionaries entsprechen in PostScript << >> und werden als Vielecke mit doppelter äußerer und einfacher innerer Umrandung dargestellt
    • Die Anfangs- und Endmarkierungen von Dictionaries sind dieselben wie bei Arrays
    • Die Reihenfolge der Einträge in einem Dictionary-Bild kann von der Reihenfolge im PostScript-Text abweichen
      • Denn in PostScript bleibt die Einfügereihenfolge in Dictionaries nicht erhalten
  • Verschachtelte Strukturen und Einschränkungen

    • Wenn eine Struktur in einer anderen erscheint, führt vom kleinen Kreis oder Punkt am Einfügepunkt eine Linie zum Start- und Endsigill des Unterrings
    • In PostScript können [ ] oder << >> auf Arten verwendet werden, die Mystical schwer verarbeiten kann
    • Formen wie im Beispiel, bei denen Array-Grenzen über Bedingungen oder Verzweigungen hinweg aufgeteilt werden, sollten vermieden werden
    • Befehle wie gsave/grestore oder begin/end können unausgeglichen verwendet werden oder Schleifen überqueren und werden daher als gewöhnliche Sigillen behandelt

Text und Sigillen

  • Am Rand eines Rings stehen Text oder Sigillen
  • Namen, die in PostScript als /name geschrieben werden, werden in Mystical als Namens-Text oder Sigill dargestellt, das von einem Dreieck umschlossen oder überlagert wird
  • PostScript-Strings () werden als Kartusche dargestellt, die den String-Text enthält
  • Standard-Sigillen

    • Viele eingebaute Operatoren haben eigene Standard-Sigillen
    • Wenn sie als Operator oder Name auftreten, wird statt Text ein Sigill verwendet; innerhalb von Strings gilt das nicht
    • Standard-Sigillen werden meist aus dem Anfangsbuchstaben des Befehls und einer bildlichen Darstellung des Konzepts zusammengesetzt; einige verwenden anschaulichere Zeichnungen oder standardisierte visuelle Sprachen
    • Die vollständige Liste steht unter Standard Sigils
    • Beispielhaft behandelte Operatorkategorien
      • dup, copy, add, mul, neg
      • for, forall, repeat
      • if, ifelse, Vergleichsoperatoren
      • moveto, lineto, arc, curveto, stroke, fill
      • gsave, grestore, translate, scale, rotate
      • Operatoren zum Setzen und Abfragen von Farben
      • dict, begin, end, def, get, put, length
  • Benutzerdefinierte Sigillen

    • Sigillen für neue Funktionen oder Namen können zur Laufzeit zu sigil_bank hinzugefügt werden
    • Benutzerdefinierte Sigillen müssen in ein Einheitsquadrat mit Ursprung im Zentrum passen; Koordinatenwerte dürfen 0.5 nicht überschreiten
    • Zur Vereinfachung kann das Koordinatensystem transformiert werden
    • Wenn statt stroke nstroke verwendet wird, entsteht derselbe kalligrafische Effekt wie bei Standard-Sigillen
    • Sigillen für benutzerdefinierte Variablen können nach jedem beliebigen Sigill-System entworfen werden
    • Die Beispiele verwenden überwiegend letter collision, inspiriert vom Chaos-Magick-System von Spare
    • Auch kameas, wheels, Square Word Calligraphy, Circular Gallifreyan, sitelen sitelen, Bilder, Wortspiele usw. sind möglich
    • Neue Namen, die von offiziellen Operatoren abgeleitet sind, können das Standard-Sigill dieses Operators enthalten

Kombinierte Notation für /name { ring } def

  • Für def gibt es ein eigenes Sigill, aber das Muster, einen Namen zu pushen, eine Funktion zu pushen und diese dann unter diesem Namen zu definieren, kommt häufig vor
  • Mystical bietet dafür eine spezielle Syntax für die Form /name { ring } def
    • Das gewöhnliche Namens-Dreieck wird verwendet
    • Das Ende der Verbindungsline liegt direkt unter dem Namen
    • Das def-Sigill entfällt vollständig
  • Diese Syntax wurde zur Vereinfachung auch auf die beiden anderen Ringtypen erweitert
  • Wenn def auf andere Weise verwendet wird, bleibt das normale def-Sigill erhalten
  • Eine ähnliche kombinierte Notation für /name { ring } innerhalb eines Dictionaries wurde erwogen, aber nicht übernommen, weil sie leicht falsch verarbeitet werden könnte

Umgang mit Kommentaren

  • Kommentare in Mystical werden als kleiner Text in einer unvollständigen Sprechblase dargestellt, die auf einen bestimmten Punkt im Programm zeigt
  • Echte PostScript-Kommentare verschwinden, bevor der Mystical-Renderer sie sieht; daher wandelt mystify.py Kommentare in eine erkennbare Code-Sequenz um
  • Zum Beispiel wird ein Kommentar wie % Show a standard message, centered horizontally in folgende Form umgewandelt
    • (Show a standard message, centered horizontally) /mystical_comment_flag pop pop
  • Der Renderer kann dieses Muster erkennen und als Mystical-Kommentar darstellen

Beispielalgorithmen

  • Die Abbildung oben auf der Seite zeigt ein Quicksort-Beispiel
  • Es ist auch ein Beispiel für den GCD-Algorithmus von Euklid enthalten
    • Dieses Beispiel verwendet die Funktion /arg {exch def} def aus dmmlib

Funktionen zur Erzeugung von Mystical-Bildern

  • Alle Funktionen sind in mystical.ps definiert
  • mystical
    • Nimmt Arrays, ausführbare Arrays und Dictionaries entgegen und rendert sie in Mystical-Form
    • Geht bei Bedarf auch in Unterstrukturen hinab und zeichnet diese
    • Das Gesamtbild wird auf den Einheitskreis skaliert
  • mystical_evoke
    • Wie mystical, nimmt aber einen Namen als Eingabe, der im aktuellen Dictionary nachgeschlagen wird
  • mystical_evoke_label
    • Ähnlich wie mystical_evoke, fügt oben jedoch eine kombinierte Name-Definitions-Notation hinzu
    • Das Bild wird gedreht, damit das Namens-Sigill aufrecht erscheint
  • Für alle drei Funktionen gibt es auch Versionen mit dem Suffix _unscaled
    • Diese Versionen überspringen den Skalierungsschritt
    • Da die Ringdicke 1 Einheit beträgt, werden die Bilder ziemlich groß
  • Die Verwendung ist in den Mystical usage notes beschrieben

Programm zur Erzeugung von Mystical-Bildern

  • Derzeit wird nur ein einziges Programm bereitgestellt: das Python-Skript mystify.py
  • mystify.py erledigt zwei Aufgaben
    • Es umhüllt ein komplettes PostScript-Programm mit Code, der es als Mystical-Programm zeichnet, und platziert es mittig auf einer 8.5x11-Seite mit 8 Zoll Breite
    • Es wandelt PostScript-Kommentarzeilen, die mit % beginnen, in Mystical-Kommentare um
  • Kommentare ganz am Anfang der Datei werden nicht umgewandelt
    • Beispiel: %!PS
  • Benachbarte Kommentarzeilen mit derselben Einrückung werden als ein langer Kommentar mit Zeilenumbrüchen behandelt
  • Layout-Einschränkungen

    • Der aktuelle Code berechnet ein Layout, das Kollisionen zwischen Unterkreisen vermeidet
    • Die Berechnung ist übervorsichtig, sodass die meisten Programme sehr weit auseinandergezogen werden können
    • Die Seitenbeispiele wurden erzeugt, indem die Parsing- und Layout-Funktionen mystical_get_spell und mystical_make_evocation_ligature ausgeführt, das Ergebnis anschließend angepasst und draw_sigil sowie draw_link aufgerufen wurden
    • Das Standard-Layout soll künftig verbessert werden

Kann man es als Sprache betrachten?

  • Derzeit ist Mystical eine Methode, PostScript-Programme zu zeichnen
  • Es gibt keinen Interpreter, der Mystical-Bilder als Eingabe nimmt und die entsprechende Berechnung ausführt
  • Ein Mensch könnte ein Mystical-Bild lesen und ausführen oder, wahrscheinlicher, es zunächst in ein PostScript-Programm zurückverwandeln und dann ausführen

Möglichkeit der Anwendung auf andere Sprachen

  • Dieser Ansatz scheint sich auch auf operator-only languages wie Forth anwenden zu lassen
  • Für Sprachen mit komplexerer Satzstruktur könnte die Anwendung schwierig sein
  • Es ist unklar, ob es zu komplex würde, für jede geschweifte Klammer oder Einrückung einen neuen Ring zu erzeugen

Download

Noch keine Kommentare.

Noch keine Kommentare.