theosirian / nanilang

Repositório para o Trabalho de Implementação de Linguagens de Programação
MIT License
3 stars 2 forks source link

Considerações quanto a vetores e variaveis #4

Open GChicha opened 5 years ago

GChicha commented 5 years ago

Estou analisando a possibilidade de tratar todas as variaveis como vetores, sendo elas de um unico elemento, só para diminuir o tamanho do codigo mesmo.

Alem disso, se não estou enganado o compilador sempre sabe o tamanho do vetor em tempo de compilação, com isso estou pensando em simplificar e sumir com aquele ArrayRef já que náo precisamos, só precisaremos achar um jeito de carregar a informação do tamanho até a função, isso até simplifica aquela discussão de vetor multidimensional, já que não precisaremos nem mesmo da ultima dimensão para poder usar isso.

GChicha commented 5 years ago

Para tentar tornar isso umm pouco mais prático:

enum Type {
  Integer,
  Boolean,
  Agg { type: Type, length: usize },
  LiteralString // Ainda não sei lidar
}

enum Symbol {
  Variable { value: LLVMValueRef, type: Type },
  Function { value: LLVMValueRef, return_type: Option<Type>, args_type: Vec<Type> }
}

Penso tambem que a expressão vai ter de retornar um tipo para tornar mais simples a verificação da validade das operações

id1 + 3 //Valido se id == Symbol {..., type: Type::Agg{ type: Type::Int, length: 1 }
sort(vetor) // Valido se vetor == Symbol { ..., type: Type::Agg{ type: Type::Int, length: NUM } }
true + 4 // Invalido?? não sei se seria estranho mas fazer 4 e true retornar Symbol tbm

let foo : int;

foo = add(3, 4) // No caso como symbol retorna o return_type como Type::Agg { type: Type::Int, length: 1 }

expr + expr

Se retornarmos expr como Symbol talvez seja suficiente