Pular para o conteúdo

Reflexão

Arcane.Reflexo: descobrir campos, métodos, modificadores, herança e anotações; invocar por nome; criar tipos em execução; desenhar o diagrama de classes.

Reflexão é o programa olhando para os próprios tipos. Arcane.Reflexo responde o que a declaração diz — e passa pelas mesmas regras que o código comum: um private continua private quando o nome chega por texto.

dataforge
adopt Arcane.Reflexo as R

contract Identificavel:
    get id() -> Integer

abstract blueprint Pessoa with Identificavel:
    readonly id := 0
    nome: String := ""
    abstract action papel()

blueprint Aluno extends Pessoa:
    mark @Coluna("matricula")
    matricula := ""
    override action papel():
        yield "aluno"

assert R.especie(Identificavel) is "contract"
assert R.mro(Aluno)[1] is Pessoa
assert Aluno in R.herdeiros(Pessoa)
assert R.contratos(Aluno) is ["Identificavel"]
assert "readonly" in R.modificadores(Aluno, "id")
assert R.anotacoes(Aluno, "matricula")[0]["args"] is ["matricula"]

nomes := [m["nome"] cycle m in R.metodos(Aluno)]
assert "papel" in nomes

a := spawn Aluno()
assert R.invocar(a, "papel") is "aluno"
R.escrever(a, "nome", "Ana")
assert R.ler(a, "nome") is "Ana"
assert R.cumpre(a, Identificavel)

A API#

GrupoFunções
tipostipo, nome, especie, molde
membroscampos, metodos, propriedades, operadores, estaticos, membros, modificadores, anotacoes, documentacao, sugerir
herançamaes, mro, herdeiros, descendentes, traits, contratos, descende, e_instancia, meta, meta_instancia
registroblueprints, procurar
dinâmicoinstanciar, tem, ler, escrever, invocar, cumpre, faltando, definir_metodo, criar_blueprint
inspeçãoinspecionar, diagrama, hierarquia

Tipos criados em execução#

criar_blueprint monta um tipo a partir de um vault, pelas regras de uma declaração escrita: mãe final recusa, contrato não cumprido recusa. Um método é um lambda que recebe o objeto como primeiro argumento.

dataforge
adopt Arcane.Reflexo as R

Ponto := R.criar_blueprint("Ponto", {
    "campos": {"x": 0, "y": 0},
    "metodos": {"norma": lambda p => sqrt(p.x ** 2 + p.y ** 2)},
})

p := R.instanciar(Ponto)
p.x := 3
p.y := 4
assert p.norma() is 5.0
assert R.procurar("Ponto") is Ponto

Diagrama de classes#

dataforge
adopt Arcane.Reflexo as R

abstract blueprint Forma:
    abstract action area()
blueprint Circulo(raio: Float) extends Forma:
    action area():
        yield 3.14 * self.raio ** 2

texto := R.diagrama(Forma)
assert "Forma <|-- Circulo" in texto
out texto

A saída é Mermaid, que o GitHub e a maioria dos editores de Markdown desenham. O mesmo diagrama sai sem rodar nada com dataforge oop src/ --diagrama.