aripiprazole / rinha-de-compiler

🥖 | Rinha de compiladores (ou interpretadores kkkk

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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 um let 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