3 puntos por GN⁺ 2025-05-18 | 1 comentarios | Compartir por WhatsApp
  • Mystical es una forma única de visualizar programas PostScript con apariencia de círculo mágico
  • Representa la estructura de programación en forma de anillos (rings), con varios tipos como arreglos ejecutables, arreglos no ejecutables y diccionarios
  • Mediante símbolos especiales llamados sigils, representa de manera original comandos, variables, cadenas y más
  • Para patrones de definición o declaraciones de funciones, aplica una representación especial de ligaduras (ligatures), y también admite sigils personalizados por el usuario
  • Actualmente es una herramienta para convertir programas PostScript en imágenes gráficas y no existe un intérprete propio

Descripción general de Mystical

Mystical es un proyecto experimental que apunta a ser un lenguaje de programación con apariencia de círculo mágico. En la práctica, es una forma de representar visualmente código PostScript con forma de círculo mágico, y en este documento ese método se denomina "Mystical".

Estructura de anillos (Rings)

  • La estructura de Mystical se basa en la forma de anillos
  • Cada anillo contiene letras y sigils, y tiene bordes interior y exterior
  • El anillo principal del programa comienza a la derecha (posición de las 3 en punto) y avanza en sentido antihorario (widdershins). Esto refleja las reglas angulares de PostScript y la idea de que los círculos mágicos se escriben de afuera hacia adentro
  • Los subanillos comienzan en el punto de contacto con el anillo superior

Tres tipos de anillos

  • Arreglo ejecutable (Executable array): corresponde a {} en PostScript. Usa bordes circulares simples por dentro y por fuera, forma de estrella, y símbolos basados en signos alquímicos al inicio/final
  • Arreglo no ejecutable (Non-executable array): corresponde a [] en PostScript. No tiene forma de estrella y usa triángulos al inicio/final
  • Diccionario (Dictionary): corresponde a <<>> en PostScript. Tiene forma poligonal, doble borde exterior y un solo borde interior. Las marcas de inicio/final son las mismas

Cuando otra estructura aparece dentro de un anillo, se conecta con pequeños puntos o líneas para representar visualmente la jerarquía

Restricciones al usar PostScript

  • En PostScript, [ ] o << >> pueden usarse de formas que no están permitidas por las reglas de Mystical, por lo que no se recomiendan
  • gsave/grestore, begin/end y otros se usan más en estructuras desbalanceadas, así que se tratan como sigils normales

Texto y sigils

  • En el borde del anillo se colocan caracteres o sigils (símbolos especiales)
  • Los sigils representan operadores, variables y palabras clave
  • En PostScript, /name se representa como un nombre o sigil dentro de un triángulo, y la cadena () como una forma de pergamino

Sigils estándar (Standard Sigils)

  • Existe un sigil propio para muchos operadores integrados
  • Normalmente se diseñan a partir de la inicial del comando, una imagen del concepto o un lenguaje visual

Ejemplos: dup, copy, add, mul, neg, for, forall, repeat, if, ifelse, eq, ne, ge, gt, le, lt, moveto, lineto, arc, arcn, curveto, closepath, stroke, fill, gsave, grestore, translate, scale, rotate, setmatrix, currentmatrix, setrgbcolor, currentrgbcolor, setcmykcolor, currentcmykcolor, sethsbcolor, currenthsbcolor, setgray, currentgray, dict, begin, end, def, get, put, length, etc.

Sigils de usuario (User Sigils)

  • Para nuevas funciones o nombres, se pueden agregar en tiempo de ejecución a sigil_bank
  • Deben diseñarse dentro de un cuadrado de 1 unidad (se permite transformación de coordenadas)
  • Al usar nstroke, pueden lograr el mismo efecto tipográfico que los sigils existentes
  • Los sigils para variables de usuario pueden crearse de muchas maneras, como superposición de letras o distintos lenguajes visuales
  • Los nombres nuevos basados en operadores oficiales pueden combinarse con sigils estándar

Ligadura de /name { ring } def

  • Se ofrece un sigil especial para patrones de uso frecuente, como definiciones de funciones
  • Solo se muestra una línea de conexión debajo del triángulo del nombre, y se omite el sigil def por separado
  • Puede aplicarse a los tres tipos de anillo
  • Los demás usos de def se manejan como sigils normales
  • Solo se aplica dentro de arreglos ejecutables; no se ofrece dentro de diccionarios porque podría generar confusión de uso

Algoritmos de ejemplo

La imagen superior es un ejemplo de Quicksort

También se ofrece un ejemplo del algoritmo de máximo común divisor (GCD) de Euclides. Ese ejemplo utiliza la función de usuario /arg {exch def} def

Funciones para generar imágenes Mystical

Todo está definido en "mystical.ps"

  • mystical: recibe un arreglo, arreglo ejecutable o diccionario, y visualiza recursivamente la estructura interna. La imagen completa se escala para ajustarse al círculo unitario
  • mystical_evoke: recibe un nombre, lo busca en el diccionario actual y lo renderiza como arriba
  • mystical_evoke_label: agrega una ligadura nombre-def y ajusta la orientación para que el sigil del nombre se vea vertical

Estas funciones también tienen versiones _unscaled. En ese caso no se pueden escalar, así que los anillos se imprimen muy grandes

Problemas de layout

  • El código actual optimiza la ubicación de los círculos hijos para evitar colisiones, pero es conservador y el resultado queda demasiado expandido
  • En las imágenes de ejemplo, tras hacer el parseo y layout con mystical_get_spell, mystical_make_evocation_ligature y otros, la imagen se imprime ajustando manualmente con las funciones draw_sigil y draw_link
  • En el futuro se planea mejorar la configuración predeterminada del layout

Mystical como lenguaje de programación

  • Actualmente, Mystical es una herramienta para dibujar programas PostScript
  • No existe un intérprete que ejecute directamente las imágenes de Mystical
  • La idea es que una persona vea la imagen y entienda el código PostScript, o que lo reescriba como programa PostScript para ejecutarlo
  • La discusión lingüística se deja para más adelante

Posible aplicación a otros lenguajes

  • En lenguajes compuestos solo por operadores, como FORTH, tiene bastante potencial de uso
  • En lenguajes con estructuras más complejas, existe el riesgo de que aparezcan demasiados anillos al aplicarlo

Descargar en github


Descargar en codeberg


Esta página fue creada por Denis el 2025-05-16

1 comentarios

 
GN⁺ 2025-05-18
Opiniones en Hacker News
  • Le recordó al anime japonés Dennō Coil, mencionando esas escenas donde los niños literalmente dibujan programas en el suelo y los usan como si fuera magia; una recomendación muy fuerte.
    • Compartió que le encantó muchísimo esa obra, porque mostraba muy bien cómo los niños adoptan la tecnología nueva de forma distinta a los adultos, e incluso le pareció una propuesta pionera que se adelantó unos 5 años a Google Glass.
    • Dijo que vino pensando exactamente lo mismo y elogió la obra como algo realmente excelente.
  • Se burlan con humor realista de esas situaciones en los juegos donde se recita magia o rituales: "he invocado a la diosa de la luna roja, preparé el altar y cargué los cristales, así que por favor esta vez arranca".
    • Añadieron otro chiste ritual: que quite las velas de encima de la pila de libros sagrados.
  • Comentó que parece un lenguaje de programación que le encantaría a un protagonista de isekai de la serie de blog de Aphyr "Xing the technical interview", recomendando que merece totalmente estar incluido ahí, y compartió un enlace de referencia relacionado.
    • Respondieron que no conocían esa serie y que en verdad está muy divertida.
  • Recomendaron un hilo de discusión en Reddit sobre ovnis relacionado con los programas de ingeniería inversa Isaac y Caret, animando a profundizar más en el tema.
  • Dijeron que este trabajo es impresionante, preguntaron por la licencia y expresaron que, si en un proyecto derivado se aplicara un estilo tipo forth usando solo recursión pura, encajaría perfectamente con el sistema de magia de un juego en el que están trabajando, que ahora mismo carece de visualización suficiente. Consideran que Mystical es una solución que estructura la magia dentro del juego y satisface tanto la forma en que el usuario la escribe como la inmersión.
    • Mencionaron que el juego Noita también tiene un sistema parecido de creación de magia, presentando su sistema de varitas donde se pueden aplicar programáticamente repeticiones, multiplicación, duplicación, etc., y compartieron el enlace de Steam del juego.
  • Compartieron como ejemplo una cita de una parte del famoso poema "Black Perl", conocido en Perl, donde los rituales mágicos y los comandos de programación se mezclan de manera brillante.
  • Opinaron que este lenguaje de programación es de hecho bastante práctico; rara vez un esolang centrado en la estética resulta tan legible y fácil de usar. Creen que esta idea también podría aplicarse a lenguajes tipo Lisp, basados en pila o de arreglos, y que combinado con un editor estructurado adecuado el código podría ser lo bastante conciso y claro como para servir en desarrollo de software real.
  • Compartieron que PostScript les pareció un lenguaje tan poderoso, aun solo con notación posfija, que casi les reconfiguró el cerebro, y elogiaron lo novedoso de combinar eso con una estética visual.
    • Pidieron recomendaciones de otros lenguajes similares para ejercitar la mente, expresando que les gustaría aprender хотя sea un poco de varios lenguajes como ps o lisp.
  • Pensaron que este enfoque podría tener varios usos; por ejemplo, podría aprovecharse como una forma más bonita de código QR. El decodificado automático sería algo complicado, pero les gusta esa combinación de sentido estético y lógica.
  • Aportaron que, si alguien quiere aprender más sobre chaos magick y los fundamentos de los hechizos sigil, debería revisar Psychonaut Field Manual.