3 pontos por GN⁺ 2025-05-18 | Ainda não há comentários. | Compartilhar no WhatsApp
  • Mystical é uma notação que desenha programas PostScript em uma estrutura circular que parece um círculo mágico; na documentação, ele é tratado como uma linguagem, mas na prática está mais próximo de uma representação visual de PostScript
  • A estrutura central é o anel (ring), e arrays executáveis {}, arrays não executáveis [] e dicionários << >> são diferenciados por bordas, estrelas, triângulos e polígonos
  • O texto na borda do anel e os sigilos (sigils) transformam operadores, variáveis, palavras-chave, strings e nomes do PostScript em símbolos ou formas decoradas
  • mystical.ps renderiza arrays, arrays executáveis e dicionários como imagens Mystical, e mystify.py envolve um programa PostScript em um desenho Mystical de 8 polegadas de largura em uma página 8.5x11, convertendo também comentários
  • Atualmente não existe interpretador que leia e execute imagens Mystical; no máximo, uma pessoa pode converter a imagem de volta para PostScript e executá-la

Notação que desenha PostScript como um círculo mágico

  • Mystical surgiu do objetivo de criar uma linguagem de programação parecida com um círculo mágico
  • Na prática, ele está mais próximo de uma forma de escrever ou desenhar PostScript com aparência de círculo mágico
  • Há documentação separada de instalação e introdução

Estrutura baseada em anéis

  • Um programa Mystical é composto por anéis (rings)
  • Um anel é uma faixa circular com borda interna e externa, dentro da qual são posicionados texto e sigilos
  • O conteúdo do anel principal começa na extremidade direita, na posição de 3 horas, e flui no sentido anti-horário
    • Isso segue o sistema angular do PostScript e também reflete a premissa de que o anel é escrito a partir do lado de fora
  • Os subanéis começam no ponto conectado à estrutura que os invocou
  • Três tipos de anel

    • Arrays executáveis correspondem a { } do PostScript, têm bordas circulares simples por dentro e por fora, e trazem uma estrela no interior
    • Os pontos de início e fim de arrays executáveis são marcados com um símbolo derivado do sinal alquímico de “obra concluída”
    • Arrays não executáveis correspondem a [ ] do PostScript e são parecidos com os executáveis, mas sem a estrela
    • Os pontos de início e fim de arrays não executáveis são marcados com triângulos simples
    • Dicionários correspondem a << >> do PostScript e são representados como polígonos com borda externa dupla e borda interna simples
    • Os marcadores de início e fim dos dicionários são iguais aos dos arrays
    • A ordem dos itens na imagem do dicionário pode ser diferente do texto PostScript
      • Isso acontece porque, em PostScript, a ordem de inserção em dicionários não é preservada
  • Estruturas aninhadas e restrições

    • Quando uma estrutura aparece dentro de outra, uma linha sai de um pequeno círculo ou ponto no local de inclusão e se conecta aos sigilos de início e fim do subanel
    • Em PostScript, [ ] ou << >> podem ser usados de formas que o Mystical tem dificuldade de processar
    • Formas como dividir os limites de um array entre condicionais ou ramificações, como no exemplo, devem ser evitadas
    • Comandos como gsave/grestore e begin/end têm grande chance de serem usados de maneira desbalanceada ou atravessando loops, então são tratados como sigilos comuns

Texto e sigilos

  • Na borda dos anéis são colocados texto ou sigilos
  • Nomes escritos como /name em PostScript são mostrados no Mystical como um triângulo envolvendo ou sobrepondo o texto ou sigilo do nome
  • Strings () do PostScript são representadas como um cartucho contendo o texto da string
  • Sigilos padrão

    • Muitos operadores embutidos têm seu próprio sigilo padrão
    • Quando aparecem como operador ou nome, usa-se o sigilo em vez do texto, mas isso não se aplica dentro de strings
    • Em geral, os sigilos padrão foram criados combinando a primeira letra do comando com uma imagem do conceito; alguns usam ilustrações mais descritivas ou linguagem visual padronizada
    • A lista completa pode ser vista em Standard Sigils
    • Categorias de operadores tratadas nos exemplos
      • dup, copy, add, mul, neg
      • for, forall, repeat
      • if, ifelse, operadores de comparação
      • moveto, lineto, arc, curveto, stroke, fill
      • gsave, grestore, translate, scale, rotate
      • operadores de definição e consulta de cores
      • dict, begin, end, def, get, put, length
  • Sigilos do usuário

    • Sigilos para novas funções ou nomes podem ser adicionados em tempo de execução ao sigil_bank
    • Os sigilos do usuário devem caber dentro de um quadrado unitário de 1 unidade centrado na origem, e os valores de coordenadas não devem exceder 0.5
    • Para conveniência, é possível transformar o sistema de coordenadas
    • Usar nstroke em vez de stroke produz o mesmo efeito caligráfico dos sigilos padrão
    • Sigilos para variáveis definidas pelo usuário podem ser projetados com qualquer sistema de sigilos
    • Os exemplos usam principalmente letter collision inspirada no sistema de Chaos Magick de Spare
    • Também são possíveis kameas, wheels, Square Word Calligraphy, Circular Gallifreyan, sitelen sitelen, desenhos, trocadilhos etc.
    • Novos nomes derivados de operadores oficiais podem incluir o sigilo padrão do operador correspondente

Notação combinada para /name { ring } def

  • def tem um sigilo próprio, mas é muito comum o padrão de empilhar um nome, empilhar uma função e então definir essa função com aquele nome
  • O Mystical oferece uma sintaxe especial para a forma /name { ring } def
    • Usa-se o triângulo normal de nome
    • A ponta da linha de conexão fica posicionada logo abaixo do nome
    • O sigilo def é omitido por completo
  • Essa sintaxe também foi estendida aos outros dois tipos de anel para simplificação
  • Ao usar def de outras maneiras, o sigilo normal de def continua sendo usado
  • Considerou-se uma notação combinada parecida para /name { ring } dentro de dicionários, mas ela não foi adotada por haver grande chance de processamento incorreto

Como os comentários são tratados

  • Os comentários no Mystical são mostrados como texto pequeno dentro de um balão de fala incompleto apontando para um ponto específico do programa
  • Como os comentários reais do PostScript desaparecem antes de o renderizador Mystical vê-los, mystify.py converte comentários em uma sequência de código detectável
  • Por exemplo, um comentário como % Show a standard message, centered horizontally é convertido para a seguinte forma
    • (Show a standard message, centered horizontally) /mystical_comment_flag pop pop
  • O renderizador pode detectar esse padrão e mostrá-lo como comentário Mystical

Algoritmos de exemplo

  • A imagem no topo da página é um exemplo de Quicksort
  • Também há um exemplo do algoritmo de GCD de Euclides
    • Esse exemplo usa a função /arg {exch def} def da dmmlib

Funções para gerar imagens Mystical

  • Todas as funções estão definidas em mystical.ps
  • mystical
    • Recebe um array, array executável ou dicionário e o renderiza em forma Mystical
    • Desce até estruturas internas quando necessário para desenhá-las
    • A imagem inteira é escalada para caber no círculo unitário
  • mystical_evoke
    • Igual a mystical, mas recebe como entrada um nome a ser buscado no dicionário atual
  • mystical_evoke_label
    • Parecida com mystical_evoke, mas adiciona acima a notação combinada de nome-definição
    • A imagem é rotacionada para que o sigilo do nome fique na orientação correta
  • As três funções também têm versões com sufixo _unscaled
    • Essas versões pulam a etapa de escala
    • Como a espessura do anel é de 1 unidade, a imagem fica bastante grande
  • O modo de uso está em Mystical usage notes

Programa para gerar imagens Mystical

  • No momento, o único programa fornecido é o script Python mystify.py
  • mystify.py realiza duas tarefas
    • Envolve todo o programa PostScript em código que o desenha como um programa Mystical, posicionando-o no centro de uma página 8.5x11 com 8 polegadas de largura
    • Converte linhas de comentário PostScript iniciadas por % em comentários Mystical
  • Os comentários no início do arquivo não são convertidos
    • Ex.: %!PS
  • Linhas de comentário adjacentes com a mesma indentação são tratadas como um único comentário longo com quebras de linha incluídas
  • Restrições de layout

    • O código atual calcula o layout para evitar colisões entre círculos internos
    • O cálculo é excessivamente conservador, então a maioria dos programas pode acabar muito espalhada
    • Os exemplos da página foram gerados executando as funções de parsing e layout mystical_get_spell e mystical_make_evocation_ligature, ajustando o resultado e então chamando draw_sigil e draw_link
    • Há planos de melhorar o layout padrão

Dá para considerar uma linguagem?

  • No estado atual, Mystical é uma forma de desenhar programas PostScript
  • Não existe interpretador que receba imagens Mystical e execute o cálculo correspondente
  • Uma pessoa pode ler e executar uma imagem Mystical, ou, mais plausivelmente, convertê-la de volta em um programa PostScript e então executá-la

Possibilidade de aplicar a outras linguagens

  • Essa abordagem parece aplicável também a linguagens com apenas operadores, como Forth
  • Pode ser difícil aplicá-la a linguagens com estruturas sintáticas mais complexas
  • Não está claro se criar um novo anel para cada chave ou nível de indentação resultaria em complexidade excessiva

Download

Ainda não há comentários.

Ainda não há comentários.