Mystical
(suberic.net)- 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.psrenderiza arrays, arrays executáveis e dicionários como imagens Mystical, emystify.pyenvolve 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
- Arrays executáveis correspondem a
-
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/grestoreebegin/endtê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
/nameem 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,negfor,forall,repeatif,ifelse, operadores de comparaçãomoveto,lineto,arc,curveto,stroke,fillgsave,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
nstrokeem vez destrokeproduz 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
- Sigilos para novas funções ou nomes podem ser adicionados em tempo de execução ao
Notação combinada para /name { ring } def
deftem 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
defde outras maneiras, o sigilo normal dedefcontinua 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.pyconverte 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} defda dmmlib
- Esse exemplo usa a função
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
- Igual a
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
- Parecida com
- 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.pyrealiza 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
- Ex.:
- 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_spellemystical_make_evocation_ligature, ajustando o resultado e então chamandodraw_sigiledraw_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
Ainda não há comentários.