Algumas dúvidas
brunokim opened this issue · comments
Olá, pessoal, parabéns pela iniciativa! Aqui vão algumas notas do q tive dúvidas até o momento, q poderiam ser destacadas no spec:
- closures sintáticas?
- escopo sintático ou de função (a la Python)?
- let de fn é sempre recursivo?
- erros: let de variável existente, operação com tipos inválidos, etc.
- shadowing de variáveis
- exemplo de uso de cons no fib.json
- Not não é Binary, qual o valor de lhs?
Aí sobre a linguagem Rinha:
- sintaxe de escape em strings?
- símbolos válidos?
- sintaxe de lista?
- precedência de operadores
Eu sei q só joguei tópicos, se algo n estiver claro eu escrevo melhor depois. Obrigado pela paciência
Alguma decisões que tomei agora foram:
- Closures capturam o ambiente em que elas foram declaradas.
- Escopo é definido pelo
let
já que ele se comporta como umlet in
com diferença no escopo global como em JS. - Let em escopo global é recursivo como se fosse em JS.
- Os erros são o usuário que define, isso foi deixado de lado de propósito
- Shadowing é um critério da linguagem que eu tenho que especificar.
- Not foi removido
Sobre as perguntas referentes a linguagem Rinha:
- Eu irei adicionar escape em breve.
- Irei adicionar a gramática
- Não há listas somente tuplas
- Irei adicionar a precedencia dos operadores em breve :)
É isso eu acho
Not não existe pra simplificar a AST
Ótimo! Eu me refiro a listas como syntax sugar pra uma sequência de tuplas. Em Prolog, isso aqui
[1, 2, 3, a | X]
é equivalente a
.(1, .(2, .(3, .(a, X))))
Se X for a lista vazia, podemos escrever
[1, 2, 3, a]
Não faz diferença na AST, então não é o mais importante agora.
Eu não conheço muito sobre Haskell e let in
, como o caso a seguir se comporta?
let x = 2;
let x = x * x; # Erro, ou referência ao let anterior?
print x
No caso de funções, o exemplo já mostra que uma referência ao símbolo do let
se refere à própria função. Se eu não me engano em ML existem dois lets: um pra quando queremos auto-referência, e outro quando não queremos.
Ótimo! Eu me refiro a listas como syntax sugar pra uma sequência de tuplas. Em Prolog, isso aqui
[1, 2, 3, a | X]
é equivalente a
.(1, .(2, .(3, .(a, X))))
Se X for a lista vazia, podemos escrever
[1, 2, 3, a]
Não faz diferença na AST, então não é o mais importante agora.
Talvez eu adicione isso é uma boa. Mas talvez eu deixe isso para amanhã já que eu to lotada de coisa como vídeo para fazer explicando como fazer um interpretador e um compilador disso para JS 'e.e
Eu não conheço muito sobre Haskell e
let in
, como o caso a seguir se comporta?let x = 2; let x = x * x; # Erro, ou referência ao let anterior? print x
No caso de funções, o exemplo já mostra que uma referência ao símbolo do
let
se refere à própria função. Se eu não me engano em ML existem dois lets: um pra quando queremos auto-referência, e outro quando não queremos.
Sim sim existe o let rec
e o let
normal. No caso do:
let x = 2; let x = x * x; # Erro, ou referência ao let anterior? print x
Ele nao irá dar erro e sim irá fazer uma referencia ao let anterior.
Belezinha, se quiserem podem fechar essa issue