
« Je voulais créer un langage de programmation qui ressemble à des anneaux magiques », a déclaré Denis Moskowitz, le créateur du langage Mystical, précisant qu'il s'agit plutôt d'« une façon d'écrire du PostScript qui ressemble à un anneau magique ».
Anneaux
La structure de Mystical est basée sur des anneaux. Il s'agit de bandes circulaires de texte et de sigils, avec une bordure intérieure et extérieure. Le contenu de l'anneau principal d'un programme commence au point le plus à droite (3:00) et le flux se poursuit dans le sens inverse des aiguilles d'une montre, à la fois pour respecter les angles de PostScript et pour refléter l'hypothèse selon laquelle ces anneaux doivent être écrits de l'extérieur. Les anneaux subsidiaires commencent à partir de leur point d'attache à leur appelant.
Il existe trois types d'anneaux dans Mystical :
- les tableaux exécutables, écrits en { } en PostScript, sont représentés par de simples bordures circulaires à l'intérieur et à l'extérieur de l'anneau, avec une sorte d'étoile à l'intérieur. Le point de départ/fin est marqué par un symbole basé sur le symbole « travail terminé » de l'alchimie.
- Les tableaux non exécutables, écrits en [ ] en PostScript, sont identiques mais sans l'étoile. Le point de départ/fin est marqué par un simple triangle.
- les dictionnaires, écrits en << >> en PostScript, sont des polygones avec une double bordure extérieure et une simple bordure intérieure. Le point de départ/fin est marqué de la même manière que le tableau.
(Notez que les entrées de l'image dict sont dans un ordre différent de celui du texte PostScript, car l'ordre d'insertion du dict n'est pas préservé dans PostScript).
Lorsque l'une de ces structures apparaît à l'intérieur d'une autre structure, un petit cercle ou un point au point d'inclusion est relié à une ligne qui mène au sigil de début/fin de l'anneau subsidiaire.
Code : | Sélectionner tout |
1 2 3 4 5 | [ 0 1 2 1.5 40 360 << /longname (Mystical) /w 45 /h 8 /x 23 >> ] |
Il est théoriquement possible d'utiliser [ ] et << >> en PostScript d'une manière que Mystical ne peut pas gérer :
Code : | Sélectionner tout |
[ 1 2 3 split { ] /first exch def [ } if 4 5 6 ] /final exch def
ne le faites donc pas.
D'autres commandes comme gsave/grestore et begin/end sont plus susceptibles d'être utilisées de manière non équilibrée ou en croisant des boucles, elles sont donc traitées comme les sigils normaux ci-dessous.
Textes et sigils
Les anneaux contiennent des textes ou des sigils. Les sigils sont des symboles qui représentent des opérateurs, des variables ou d'autres mots-clés. Tout nom, écrit en PostScript sous la forme /name, est écrit avec un triangle entourant ou superposant le texte du nom ou son sigil. Les chaînes de caractères, écrites en Postscript sous la forme (), sont des formes en cartouche contenant le texte de la chaîne.
Sigils standard
De nombreux opérateurs intégrés ont été dotés de leurs propres sigils. Ceux-ci sont utilisés à la place du texte de l'opérateur s'il apparaît en tant que nom ou opérateur (mais pas s'il apparaît en tant que chaîne de caractères). Ces sigils sont généralement basés sur l'initiale de la commande et sur une illustration du concept, mais dans certains cas, l'auteur a opté pour une illustration plus complète ou il a créé un langage visuel standard.
Sigils utilisateurs
Les sigils de nouvelles fonctions ou de nouveaux noms peuvent être ajoutés à sigil_bank au moment de l'exécution. Ils doivent tenir dans un carré de 1 unité centré sur l'origine, donc aucune coordonnée ne doit être supérieure à 0,5 (bien sûr, vous pouvez transformer votre système de coordonnées pour plus de commodité). Si vous utilisez nstroke au lieu de stroke, vous obtiendrez le même effet calligraphique que les sigils standard.
Les sigils pour les variables utilisateur peuvent être conçus avec n'importe quel système de sigils. Les exemples utilisent principalement la collision de lettres, inspirée par le système Chaos Magick de Spare, mais tout ce qui transforme un mot en symbole fonctionnera - kameas, wheels, Square Word Calligraphy, Circular Gallifreyan, sitelen sitelen, illustration, puns, etc. Les nouveaux noms basés sur les opérateurs officiels peuvent incorporer les sigils standards de ces opérateurs.
Ligature pour /name { ring } def
Il existe un sigil pour def, mais un schéma très courant consiste à pousser un nom, pousser une fonction, et def le nom à la fonction. Pour gagner de la place et mettre l'accent sur cette définition, il existe une syntaxe spéciale pour ce cas, qui consiste en un triangle de nom habituel avec la fin de la ligne de lien directement en dessous, et le sigil def est entièrement omis. Cette syntaxe est étendue aux deux autres types d'anneaux pour plus de simplicité. Toute autre utilisation de def utilisera le sigil def comme à l'accoutumée.
Ceci ne s'applique qu'à l'intérieur des tableaux exécutables. Une ligature similaire a été envisagée pour /name { ring } dans les dictionnaires, mais il y a trop de risques de se tromper.
Exemples d'algorithmes
Le tri rapide est l'illustration fournie en haut de page.
L'algorithme GCD d'Euclide (en utilisant la fonction /arg {exch def} def de dmmlib) :
Fonctions pour générer des images Mystical
Toutes ces fonctions sont définies dans « mystical.ps ».
mystical : prend un tableau, un xarray, ou un dict et le rend en mystical, en descendant dans les sous-structures si nécessaire. L'image entière sera mise à l'échelle pour tenir dans un cercle unitaire.
mystical_evoke : Identique à mystical mais prend un nom qui est recherché dans le dictionnaire courant.
mystical_evoke_label : Comme mystical_evoke mais ajoute une ligature name-def avec le nom en haut et oriente l'image de façon à ce que le sigil du nom soit à l'endroit.
Toutes ces images ont des versions avec _unscaled qui sautent l'étape de mise à l'échelle. Les anneaux auront une épaisseur d'une unité et l'image sera donc assez grande.
Problèmes de mise en page
Actuellement, le code calcule la disposition des sous-cercles de façon à ce que rien n'entre en collision, mais il est trop sûr et la plupart des programmes seront très dispersés. Pour les exemples de cette page, les fonctions d'analyse et de mise en page (mystical_get_spell et mystical_make_evocation_ligature) ont été exécutées, puis les résultats ont été ajustés avant d'appeler les fonctions de dessin (draw_sigil et draw_link). Il est prévu d'améliorer quelque peu la mise en page par défaut.
S'agit-il d'un langage de programmation ?
Pour l'instant, c'est une façon de dessiner un programme PostScript - il n'y a pas d'interprète qui ingère une image Mystical et effectue le calcul approprié. Elle pourrait être exécutée et interprétée par un humain, ou (plus probablement) un humain pourrait la lire et la transformer en un programme PostScript et l'exécuter. Pour l'instant, le soin de développer des arguments philosophiques est laissé à d'autres personnes.
Cela pourrait-il fonctionner pour d'autres langages ?
Cette approche semble applicable à d'autres langages ne comportant que des opérateurs, comme Forth. Les langages avec des déclarations plus compliquées pourraient être plus difficiles, et l'on ne sait pas si un nouvel anneau pour chaque accolade ou chaque indentation serait trop encombrant.
Source : Mystical
Et vous ?


Voir aussi :



Vous avez lu gratuitement 10 articles depuis plus d'un an.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.