Open GChicha opened 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
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.