3 puntos por GN⁺ 2025-05-18 | Aún no hay comentarios. | Compartir por WhatsApp
  • Mystical es una notación para dibujar programas de PostScript como una estructura circular que parece un círculo mágico; en la documentación se trata como si fuera un lenguaje, pero en realidad está más cerca de una representación visual de PostScript
  • La estructura central es el anillo (ring), y distingue arreglos ejecutables {}, arreglos no ejecutables [] y diccionarios << >> con bordes, estrellas, triángulos y polígonos
  • El texto en el borde del anillo y los sigilos (sigils) convierten operadores, variables, palabras clave, cadenas y nombres de PostScript en símbolos o formas decoradas
  • mystical.ps renderiza arreglos, arreglos ejecutables y diccionarios como imágenes Mystical, y mystify.py envuelve un programa PostScript en un dibujo Mystical de 8 pulgadas de ancho sobre una página de 8.5x11, convirtiendo también los comentarios
  • Actualmente no existe un intérprete que lea imágenes Mystical y las ejecute; el nivel actual es que una persona puede convertir la imagen a PostScript y ejecutarla

Notación para dibujar PostScript como un círculo mágico

  • Mystical surgió del objetivo de crear un lenguaje de programación que se pareciera a un círculo mágico
  • En la práctica, está más cerca de una forma de escribir o dibujar PostScript para que parezca un círculo mágico
  • La instalación y la guía de introducción se ofrecen por separado

Estructura basada en anillos

  • Un programa Mystical se compone de anillos (rings)
  • Un anillo es una banda circular con borde interior y exterior, dentro de la cual se colocan texto y sigilos
  • El contenido del anillo principal empieza en el extremo derecho, en la posición de las 3 en punto, y fluye en sentido antihorario
    • Esto sigue el sistema angular de PostScript y también refleja la idea de que el anillo se escribe desde afuera
  • Los subanillos empiezan en el punto conectado con la estructura que los invocó
  • Tres tipos de anillo

    • Los arreglos ejecutables corresponden a { } en PostScript, tienen bordes circulares simples por dentro y por fuera, y una estrella en el interior
    • El punto de inicio y fin de un arreglo ejecutable se marca con un símbolo tomado del signo alquímico de “obra completada”
    • Los arreglos no ejecutables corresponden a [ ] en PostScript y son similares a los ejecutables, pero sin estrella
    • El punto de inicio y fin de un arreglo no ejecutable se marca con un triángulo simple
    • Los diccionarios corresponden a << >> en PostScript y se representan como un polígono con doble borde exterior y un solo borde interior
    • Las marcas de inicio y fin de un diccionario son iguales a las de los arreglos
    • El orden de los elementos en la imagen del diccionario puede diferir del texto PostScript
      • Esto se debe a que en PostScript no se preserva el orden de inserción en los diccionarios
  • Estructuras anidadas y restricciones

    • Cuando una estructura aparece dentro de otra, sale una línea desde el pequeño círculo o punto del lugar de inclusión y se conecta con el sigilo de inicio o fin del subanillo
    • En PostScript, [ ] o << >> pueden usarse de maneras que Mystical tiene dificultades para procesar
    • Deben evitarse formas como las del ejemplo, donde los límites de un arreglo se dividen dentro de una condición o una bifurcación
    • Comandos como gsave/grestore y begin/end tienen alta probabilidad de usarse de forma desbalanceada o cruzando bucles, así que se tratan como sigilos normales

Texto y sigilos

  • En el borde del anillo se colocan texto o sigilos
  • Los nombres que en PostScript se escriben como /name se representan en Mystical con un triángulo que envuelve o se superpone al texto o sigilo del nombre
  • Las cadenas () de PostScript se representan como un cartucho que contiene el texto de la cadena
  • Sigilos estándar

    • Muchos operadores integrados tienen su propio sigilo estándar
    • Cuando aparecen como operador o nombre, se usa el sigilo en lugar del texto, pero esto no se aplica dentro de cadenas
    • Los sigilos estándar suelen crearse combinando la primera letra del comando con una imagen del concepto; algunos usan ilustraciones más descriptivas o un lenguaje visual estandarizado
    • La lista completa puede verse en Standard Sigils
    • Categorías de operadores tratadas como ejemplo
      • dup, copy, add, mul, neg
      • for, forall, repeat
      • if, ifelse, operadores de comparación
      • moveto, lineto, arc, curveto, stroke, fill
      • gsave, grestore, translate, scale, rotate
      • Operadores para establecer y consultar color
      • dict, begin, end, def, get, put, length
  • Sigilos de usuario

    • Los sigilos para nuevas funciones o nombres pueden agregarse en tiempo de ejecución a sigil_bank
    • Los sigilos de usuario deben caber dentro de un cuadrado unitario centrado en el origen, y los valores de coordenadas no deben exceder 0.5
    • Por conveniencia, se puede transformar el sistema de coordenadas
    • Si se usa nstroke en lugar de stroke, se obtiene el mismo efecto caligráfico que tienen los sigilos estándar
    • Los sigilos para variables de usuario pueden diseñarse con cualquier sistema de sigilos
    • Los ejemplos usan principalmente colisión de letras inspirada en el sistema de Chaos Magick de Spare
    • También pueden usarse kameas, wheels, Square Word Calligraphy, Circular Gallifreyan, sitelen sitelen, dibujos, juegos de palabras, etc.
    • Los nombres nuevos derivados de operadores oficiales pueden incluir el sigilo estándar de ese operador

Notación combinada para /name { ring } def

  • def tiene su propio sigilo, pero es común el patrón de empujar un nombre, luego una función, y definir esa función con ese nombre
  • Mystical ofrece una sintaxis especial para la forma /name { ring } def
    • Se usa el triángulo normal del nombre
    • El extremo de la línea de conexión se coloca justo debajo del nombre
    • El sigilo de def se omite por completo
  • Esta sintaxis se extiende también a los otros dos tipos de anillo para simplificar
  • Cuando def se usa de otra manera, se mantiene el sigilo normal de def
  • Se consideró una notación combinada similar para /name { ring } dentro de diccionarios, pero no se aplica porque sería fácil procesarla mal

Cómo se manejan los comentarios

  • Los comentarios en Mystical se muestran como texto pequeño dentro de un globo de diálogo incompleto que apunta a un punto específico del programa
  • Los comentarios reales de PostScript desaparecen antes de que el renderizador Mystical pueda verlos, así que mystify.py los transforma en una secuencia de código detectable
  • Por ejemplo, un comentario como % Show a standard message, centered horizontally se convierte a la forma siguiente
    • (Show a standard message, centered horizontally) /mystical_comment_flag pop pop
  • El renderizador puede detectar este patrón y mostrarlo como comentario Mystical

Algoritmos de muestra

  • La figura de la parte superior de la página es un ejemplo de Quicksort
  • También se incluye un ejemplo del algoritmo de MCD de Euclides
    • Este ejemplo usa la función /arg {exch def} def de dmmlib

Funciones para generar imágenes Mystical

  • Todas las funciones están definidas en mystical.ps
  • mystical
    • Recibe un arreglo, arreglo ejecutable o diccionario y lo renderiza en forma Mystical
    • Si hace falta, desciende también a las estructuras subordinadas y las dibuja
    • La imagen completa se escala para ajustarse al círculo unitario
  • mystical_evoke
    • Igual que mystical, pero recibe como entrada un nombre para buscar en el diccionario actual
  • mystical_evoke_label
    • Similar a mystical_evoke, pero agrega arriba la notación combinada de nombre-definición
    • Rota la imagen para que el sigilo del nombre se vea derecho
  • Las tres funciones también tienen versiones con sufijo _unscaled
    • Estas versiones omiten la etapa de escalado
    • Como el grosor del anillo es de 1 unidad, la imagen se vuelve bastante grande
  • El uso está en Mystical usage notes

Programa para generar imágenes Mystical

  • Actualmente solo se ofrece un programa: el script de Python mystify.py
  • mystify.py realiza dos tareas
    • Envuelve un programa PostScript completo con código para dibujarlo como un programa Mystical y lo coloca centrado en una página de 8.5x11 con un ancho de 8 pulgadas
    • Convierte las líneas de comentarios de PostScript que empiezan con % en comentarios Mystical
  • No convierte los comentarios del principio del archivo
    • Ejemplo: %!PS
  • Las líneas de comentario adyacentes con la misma sangría se tratan como un único comentario largo con saltos de línea incluidos
  • Restricciones de diseño

    • El código actual calcula la disposición para evitar que los subcírculos choquen entre sí
    • El cálculo es excesivamente conservador, así que la mayoría de los programas pueden quedar muy dispersos
    • El ejemplo de página se creó ejecutando las funciones de parsing y layout mystical_get_spell y mystical_make_evocation_ligature, ajustando luego el resultado y llamando a draw_sigil y draw_link
    • Hay planes de mejorar el layout predeterminado

¿Puede considerarse un lenguaje?

  • Actualmente Mystical es una forma de dibujar programas de PostScript
  • No existe un intérprete que reciba imágenes Mystical como entrada y realice el cálculo correspondiente
  • Una persona podría leer y ejecutar una imagen Mystical o, de forma más realista, convertirla a un programa PostScript y ejecutarla

Posibilidad de aplicarlo a otros lenguajes

  • Este enfoque parece aplicable también a lenguajes de solo operadores como Forth
  • Puede resultar difícil aplicarlo a lenguajes con estructuras sintácticas más complejas
  • No está claro si crear un nuevo anillo por cada llave o nivel de sangría terminaría volviéndose demasiado complejo

Descarga

Aún no hay comentarios.

Aún no hay comentarios.