3 points par GN⁺ 2025-05-18 | Aucun commentaire pour le moment. | Partager sur WhatsApp
  • Mystical est un système de notation qui dessine les programmes PostScript sous forme de structures circulaires ressemblant à des cercles magiques ; la documentation le traite comme un langage, mais il s’agit en réalité plutôt d’une représentation visuelle de PostScript
  • Sa structure centrale est le ring : les tableaux exécutables {}, les tableaux non exécutables [] et les dictionnaires << >> sont distingués par des bordures, des étoiles, des triangles et des polygones
  • Le texte et les sigils placés sur le bord d’un ring transforment les opérateurs, variables, mots-clés, chaînes et noms PostScript en symboles ou en formes décorées
  • mystical.ps rend les tableaux, tableaux exécutables et dictionnaires sous forme d’images Mystical, tandis que mystify.py enveloppe un programme PostScript dans un dessin Mystical de 8 pouces de large sur une page 8,5x11, en convertissant aussi les commentaires
  • Il n’existe actuellement pas d’interpréteur capable de lire une image Mystical pour effectuer un calcul ; on en est au stade où une personne peut convertir l’image en PostScript puis l’exécuter

Une notation qui dessine PostScript comme un cercle magique

  • Mystical est né de l’objectif de créer un langage de programmation ressemblant à un cercle magique
  • En pratique, il s’agit plutôt d’une manière d’écrire ou de dessiner du PostScript sous une forme évoquant un cercle magique
  • L’installation et les documents de prise en main sont fournis séparément

Structure fondée sur des rings

  • Un programme Mystical est composé de rings
  • Un ring est une bande circulaire dotée d’une bordure intérieure et d’une bordure extérieure, dans laquelle sont placés du texte et des sigils
  • Le contenu du ring principal commence à l’extrémité droite, à 3 heures, et progresse dans le sens antihoraire
    • Cela suit le système d’angles de PostScript et reflète aussi l’hypothèse selon laquelle le ring est écrit depuis l’extérieur
  • Un sous-ring commence au point relié à la structure qui l’a appelé
  • Trois types de rings

    • Un tableau exécutable correspond aux { } de PostScript ; il possède de simples bordures circulaires à l’intérieur et à l’extérieur, avec une étoile à l’intérieur
    • Les points de début et de fin d’un tableau exécutable sont indiqués par un symbole tiré du signe alchimique du « travail accompli »
    • Un tableau non exécutable correspond aux [ ] de PostScript ; il est similaire au tableau exécutable, mais sans étoile
    • Les points de début et de fin d’un tableau non exécutable sont indiqués par de simples triangles
    • Un dictionnaire correspond aux << >> de PostScript ; il est représenté par un polygone avec une double bordure extérieure et une bordure intérieure simple
    • Les marqueurs de début et de fin d’un dictionnaire sont les mêmes que pour les tableaux
    • L’ordre des éléments dans l’image d’un dictionnaire peut différer de celui du texte PostScript
      • Car PostScript ne préserve pas l’ordre d’insertion dans les dictionnaires
  • Structures imbriquées et contraintes

    • Lorsqu’une structure apparaît à l’intérieur d’une autre, une ligne part d’un petit cercle ou point à l’emplacement d’inclusion et rejoint le sigil de début/fin du sous-ring
    • Dans PostScript, [ ] ou << >> peuvent être utilisés d’une manière difficile à traiter pour Mystical
    • Il faut éviter les formes qui, comme dans l’exemple, répartissent les limites d’un tableau entre une condition ou une branche
    • Les commandes comme gsave/grestore ou begin/end sont susceptibles d’être utilisées de façon déséquilibrée ou de traverser des boucles ; elles sont donc traitées comme des sigils ordinaires

Texte et sigils

  • Sur le bord d’un ring se trouvent du texte ou des sigils
  • Les noms écrits sous la forme /name en PostScript sont représentés dans Mystical par un triangle entourant ou chevauchant le texte du nom ou son sigil
  • Les chaînes PostScript () sont représentées sous forme de cartouche contenant le texte de la chaîne
  • Sigils standard

    • De nombreux opérateurs intégrés ont leur propre sigil standard
    • Lorsqu’ils apparaissent comme opérateurs ou noms, le sigil est utilisé à la place du texte, mais cela ne s’applique pas à l’intérieur des chaînes
    • Les sigils standard ont généralement été créés en combinant la première lettre de la commande avec une illustration du concept ; certains utilisent un dessin plus explicite ou un langage visuel standardisé
    • La liste complète est disponible dans Standard Sigils
    • Catégories d’opérateurs traitées dans les exemples
      • dup, copy, add, mul, neg
      • for, forall, repeat
      • if, ifelse, opérateurs de comparaison
      • moveto, lineto, arc, curveto, stroke, fill
      • gsave, grestore, translate, scale, rotate
      • Opérateurs de définition et de consultation des couleurs
      • dict, begin, end, def, get, put, length
  • Sigils utilisateur

    • Les sigils de nouvelles fonctions ou de nouveaux noms peuvent être ajoutés à sigil_bank à l’exécution
    • Un sigil utilisateur doit tenir dans un carré de 1 unité centré sur l’origine, et ses coordonnées ne doivent pas dépasser 0,5
    • Le système de coordonnées peut être transformé par commodité
    • Utiliser nstroke au lieu de stroke permet d’obtenir le même effet calligraphique que les sigils standard
    • Les sigils destinés aux variables utilisateur peuvent être conçus selon n’importe quel système de sigils
    • Les exemples utilisent principalement des collisions de lettres inspirées du système de Chaos Magick de Spare
    • Les kameas, wheels, Square Word Calligraphy, Circular Gallifreyan, sitelen sitelen, dessins, jeux de mots, etc. sont également possibles
    • Les nouveaux noms dérivés d’opérateurs officiels peuvent inclure le sigil standard de l’opérateur correspondant

Notation combinée pour /name { ring } def

  • def possède un sigil distinct, mais le motif consistant à pousser un nom, puis une fonction, puis à définir cette fonction sous ce nom revient souvent
  • Mystical fournit une syntaxe spéciale pour la forme /name { ring } def
    • Elle utilise le triangle de nom ordinaire
    • L’extrémité de la ligne de connexion est placée juste sous le nom
    • Le sigil def est entièrement omis
  • Cette syntaxe est étendue aux deux autres types de rings par souci de simplification
  • Lorsqu’on utilise def autrement, le sigil def ordinaire est conservé
  • Une notation combinée similaire pour /name { ring } à l’intérieur d’un dictionnaire a été envisagée, mais elle n’est pas appliquée car le risque de traitement incorrect est élevé

Gestion des commentaires

  • Les commentaires de Mystical sont affichés sous forme de petit texte dans une bulle incomplète pointant vers un emplacement précis du programme
  • Les vrais commentaires PostScript disparaissent avant que le moteur de rendu Mystical ne les voie ; mystify.py les transforme donc en séquences de code détectables
  • Par exemple, un commentaire comme % Show a standard message, centered horizontally est transformé sous la forme suivante
    • (Show a standard message, centered horizontally) /mystical_comment_flag pop pop
  • Le moteur de rendu peut détecter ce motif et l’afficher comme un commentaire Mystical

Exemples d’algorithmes

  • L’illustration en haut de la page est un exemple de Quicksort
  • Un exemple de l’algorithme du PGCD d’Euclide est également inclus
    • Cet exemple utilise la fonction /arg {exch def} def de dmmlib

Fonctions de génération d’images Mystical

  • Toutes les fonctions sont définies dans mystical.ps
  • mystical
    • Prend un tableau, un tableau exécutable ou un dictionnaire et le rend sous forme Mystical
    • Descend dans les sous-structures si nécessaire pour les dessiner
    • L’image complète est mise à l’échelle pour tenir dans le cercle unité
  • mystical_evoke
    • Identique à mystical, mais prend en entrée un nom à rechercher dans le dictionnaire courant
  • mystical_evoke_label
    • Similaire à mystical_evoke, mais ajoute en haut la notation combinée nom-définition
    • Fait pivoter l’image pour que le sigil du nom apparaisse à l’endroit
  • Les trois fonctions existent aussi en versions suffixées par _unscaled
    • Ces versions sautent l’étape de mise à l’échelle
    • Comme l’épaisseur du ring est de 1 unité, l’image devient assez grande
  • Le mode d’emploi figure dans Mystical usage notes

Programme de génération d’images Mystical

  • Le seul programme actuellement fourni est le script Python mystify.py
  • mystify.py effectue deux tâches
    • Il enveloppe un programme PostScript complet dans du code qui le dessine comme un programme Mystical, et le place au centre d’une page 8,5x11 avec une largeur de 8 pouces
    • Il convertit les lignes de commentaires PostScript commençant par % en commentaires Mystical
  • Les commentaires tout au début du fichier ne sont pas convertis
    • Exemple : %!PS
  • Les lignes de commentaires adjacentes ayant la même indentation sont traitées comme un seul long commentaire contenant des sauts de ligne
  • Contraintes de mise en page

    • Le code actuel calcule une mise en page pour éviter les collisions entre les cercles enfants
    • Le calcul est excessivement prudent, ce qui peut étaler très largement la plupart des programmes
    • L’exemple de la page a été créé en exécutant les fonctions d’analyse et de mise en page mystical_get_spell, mystical_make_evocation_ligature, puis en ajustant le résultat et en appelant draw_sigil et draw_link
    • La mise en page par défaut est prévue pour être améliorée

Peut-on le considérer comme un langage ?

  • Actuellement, Mystical est une manière de dessiner des programmes PostScript
  • Il n’existe pas d’interpréteur prenant une image Mystical en entrée pour effectuer le calcul approprié
  • Une personne pourrait lire une image Mystical et l’exécuter, ou, plus vraisemblablement, la convertir en programme PostScript avant de l’exécuter

Possibilité d’application à d’autres langages

  • Cette approche semble applicable à des langages composés uniquement d’opérateurs, comme Forth
  • Elle pourrait être difficile à appliquer à des langages ayant une structure de phrases plus complexe
  • On ne sait pas si créer un nouveau ring à chaque accolade ou indentation deviendrait excessivement compliqué

Téléchargement

Aucun commentaire pour le moment.

Aucun commentaire pour le moment.