Mystical
(suberic.net)- Mystical é uma forma única de visualizar programas em PostScript no formato de círculos mágicos
- Representa a estrutura de programação na forma de anéis (rings), com vários tipos como arrays executáveis, arrays não executáveis e dicionários
- Usa símbolos especiais chamados sigils para representar de forma original comandos, variáveis, strings etc.
- Padrões de definição ou declarações de função usam uma representação especial de ligature, e sigils personalizados também são suportados
- Atualmente é uma ferramenta para converter programas PostScript em imagens gráficas; não existe um interpretador próprio
Visão geral do Mystical
Mystical é um projeto experimental que tem como objetivo ser uma linguagem de programação parecida com um círculo mágico. Na prática, é uma forma de representar visualmente código PostScript em formato de círculo mágico, e este documento chama esse método de “Mystical”.
Estrutura de anéis (Rings)
- A estrutura do Mystical é centrada na forma de anéis
- Cada anel contém letras e sigils, e possui bordas interna e externa
- O anel principal do programa começa à direita (posição de 3 horas) e segue no sentido anti-horário (widdershins). Isso reflete a regra angular do PostScript e a ideia de que círculos mágicos são escritos de fora para dentro
- Anéis subordinados começam no ponto de contato com o anel superior
Os três tipos de anel
- Array executável (Executable array): corresponde a
{}no PostScript. Usa bordas circulares simples por dentro e por fora, além de formato de estrela, com símbolos baseados em sinais alquímicos no início/fim - Array não executável (Non-executable array): corresponde a
[]no PostScript. Não tem formato de estrela e usa triângulos no início/fim - Dicionário (Dictionary): corresponde a
<<>>no PostScript. Tem formato poligonal, com borda externa dupla e borda interna simples. A marcação de início/fim é a mesma
Quando outra estrutura entra dentro de um anel, ela é conectada por pequenos pontos ou linhas, representando visualmente a hierarquia
Limitações no uso de PostScript
- Em PostScript,
[ ]ou<< >>podem ser usados de maneiras que as regras do Mystical não permitem, por isso isso não é recomendado gsave/grestore,begin/endetc. são mais usados em estruturas desequilibradas, então são tratados como sigils normais
Texto e sigils
- Na borda do anel são colocados caracteres ou sigils (símbolos especiais)
- Os sigils representam operadores, variáveis e palavras-chave
/nameem PostScript é representado como um nome ou sigil dentro de um triângulo, e strings()como um formato de pergaminho
Sigils padrão (Standard Sigils)
- Há sigils exclusivos para muitos operadores embutidos
- Em geral, o design é baseado na inicial do comando, em uma figura conceitual ou em uma linguagem visual
Ex.: 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 usuário (User Sigils)
- Para novas funções ou nomes, é possível adicionar em tempo de execução ao
sigil_bank - O design precisa caber em um quadrado de 1 unidade (transformações de coordenadas são possíveis)
- Ao usar
nstroke, é possível obter o mesmo efeito tipográfico dos sigils existentes - Sigils para variáveis de usuário podem ser criados de várias formas (sobreposição de letras, diferentes linguagens visuais etc.)
- Novos nomes baseados em operadores oficiais podem ser combinados com sigils padrão
Ligature para /name { ring } def
- Há um sigil especial para padrões usados com frequência, como definições de função
- Apenas a linha de conexão é mostrada abaixo do triângulo do nome, e o sigil
defseparado é omitido - Pode ser aplicado aos três tipos de anel
- Outros usos de
defsão tratados como sigils normais - Só se aplica dentro de arrays executáveis; dentro de dicionários não é fornecido, por poder causar confusão de uso
Algoritmos de exemplo
A figura superior mostra um exemplo de Quicksort
Também é fornecido um exemplo do algoritmo do máximo divisor comum (GCD) de Euclides. Esse exemplo usa a função de usuário /arg {exch def} def
Funções de geração de imagem do Mystical
Todas estão definidas em "mystical.ps"
- mystical: recebe um array, array executável ou dicionário e visualiza recursivamente até a estrutura interna. A imagem inteira é ajustada em escala para caber no círculo unitário
- mystical_evoke: recebe um nome, procura no dicionário atual e renderiza como acima
- mystical_evoke_label: adiciona a ligature nome-def e ajusta a orientação para que o sigil do nome fique vertical
Essas funções também têm versões _unscaled. Nesse caso, não é possível escalar, então os anéis são impressos em tamanho muito grande
Problemas de layout
- O código atual otimiza o posicionamento dos círculos filhos sem colisões, mas é conservador, então o layout acaba ficando aberto demais
- Nas imagens de exemplo, após fazer parsing/layout com
mystical_get_spell,mystical_make_evocation_ligatureetc., a figura é gerada com ajustes manuais usando as funções draw_sigil e draw_link - No futuro, as configurações padrão de layout devem ser melhoradas
Mystical como linguagem de programação
- Atualmente, Mystical é uma ferramenta para desenhar programas PostScript
- Não existe um interpretador que execute diretamente as próprias imagens do Mystical
- A ideia é que uma pessoa veja a imagem e entenda o código PostScript, ou o reescreva como um programa PostScript para executar
- Discussões sobre a linguagem em si ficam para depois
Possibilidade de aplicação a outras linguagens
- Em linguagens compostas apenas por operadores, como FORTH, há bastante potencial de uso
- Em linguagens com estrutura mais complexa, existe o risco de surgirem anéis demais
Esta página foi criada em 2025-05-16 por Denis
1 comentários
Comentários do Hacker News