Lançamento do Elixir 1.17: tipos por teoria dos conjuntos em padrões, Duration e OTP 27
(elixir-lang.org)- Tipos graduais por teoria dos conjuntos adicionados para inferir tipos a partir de padrões e emitir avisos em tempo de compilação, ajudando a encontrar defeitos e bugs na base de código sem exigir mudanças no software existente
- Os novos avisos de tipo atualmente focam em atom e map/struct, detectando pattern matching com chaves inexistentes, acesso a campos inexistentes, chamadas de função em não-módulos, chamadas inválidas de funções anônimas, comparação estrutural entre structs, comparação entre tipos sem interseção, padrões binary inválidos e
rescuede exceções não definidas - O verificador de tipos atualmente infere tipos apenas a partir de padrões dentro da mesma função; análises entre guards e fronteiras de funções estão previstas para versões futuras
- Adicionado suporte ao Erlang/OTP 27 e encerrado o suporte ao Erlang/OTP 24; a migração para Erlang/OTP 26 ou superior é recomendada, incluindo no Windows
- O suporte ao WERL, a interface gráfica de terminal do Erlang no Windows, será removido no Elixir v1.18
- Adicionados o novo tipo de dado
DurationeDate.shift/2, permitindo deslocar datas, horários e datetimes com base em duration; noDateTime, isso inclui mudanças de fuso horário e tratamento de horário de verão - Adicionado
Kernel.to_timeout/1para normalizar duration e integer em valores de timeout usados por várias APIs, comoProcesseGenServer - O recurso de process label do Erlang/OTP 27 pode ser usado no Elixir com
Process.set_label/1, e o Logger agora formata relatórios dogen_stateme inclui process labels do Erlang/OTP 27 em eventos de log - Adicionados
Keyword.intersect/2,3, o novo profiler do Mixmix profile.tprofe o guardKernel.is_non_struct_map/1para reduzir a armadilha de%{}também corresponder a structs - Com a adição de
mix profile.tprof,mix profile.cprofemix profile.eprofpassam a ser soft-deprecated
1 comentários
Opiniões no Hacker News
Nos últimos anos, o ecossistema Elixir vem se tornando a solução mais simples para muitos tipos de uso
Com Phoenix e LiveView, o desenvolvimento web é rápido e prazeroso; com NX/Axon/Bumblebee, dá para fazer inteligência artificial; com Membrane, streaming e processamento de áudio e vídeo; com Commanded, CQRS e event sourcing; com Nerves, criar dispositivos embarcados; e, com o LiveView Native, ainda em desenvolvimento, até apps móveis
Filas, pipelines e processamento em lote também podem ser tratados conforme a necessidade, com recursos nativos ou com GenStage, Broadway e Oban
Ainda assim, pessoalmente, o recurso central é o IEx, o REPL do Elixir. Poder interagir diretamente com código em desenvolvimento ou em produção, inspecionar por dentro e depurar é algo que muda a vida
A chegada de tipos a isso é a última peça do quebra-cabeça para termos mais confiança no código que colocamos em produção
O Ecto permite lidar com bancos de dados SQL de forma funcional; ainda não sei exatamente como encarar ORMs, mas, se com algumas consultas componíveis foi possível eliminar 90% do SQL, considero um sucesso
Depois de passar meses sofrendo com deploy, tempo de atividade, falhas de segmentação, tempos de pacotes e afins, migrei o servidor web e a camada de dados para Elixir + Phoenix, e agora tudo está muito mais bem testado, mais fácil de raciocinar, com escalabilidade mais confiável e deploy mais simples
Graças à convenção em vez de configuração, foi absurdamente rápido começar com Phoenix, muito mais rápido do que com FastAPI. Fico pensando que deveria ter feito isso meses antes
Agora estou treinando modelos com Nx, experimentando Bumblebee/Livebook e adicionando recursos de presence e live ao app praticamente de graça
Tudo usando os mesmos conceitos, desempenho e conveniência de desenvolvimento do LiveView
Acho que seria difícil voltar para algo como Erlang ou Elixir
Sinto muita falta dele toda vez que escrevo código em outras linguagens, especialmente quando estou programando profissionalmente
Um bom REPL reduz muito o atrito comum na programação. Em vez de rodar o app inteiro para cutucar um trecho problemático de código, você pode construir ideias aos poucos e testá-las na hora
A biblioteca padrão do Elixir também é excelente, e é muito fácil acessar a documentação pelo REPL, o que ajuda muito a manter o fluxo. Quando programo em Elixir, raramente abro o navegador para pesquisar pequenas dúvidas, porque geralmente encontro a resposta sem sair do REPL
Isso também me incentiva a escrever boas docstrings no meu próprio código
O melhor ainda é poder rodar o REPL junto com o código em execução. Mesmo quando preciso executar o app, posso deixá-lo rodando e, no ambiente de desenvolvimento, manipular dados ao vivo e examinar o estado interno. Em outras stacks, isso é impossível ou exige um depurador
Com a chegada dos recursos relacionados a tipos, espero que as ferramentas fiquem ainda melhores
Some a isso a diversão e a força do paradigma funcional, além de formas robustas de lidar com mutabilidade e estado, sem precisar encarar a sintaxe de LISP. Pessoalmente, é uma linguagem que acerta todas as notas para mim, e eu gosto muito dela
O IEx faz algo que o IRB não faz?
Nos últimos anos, as equipes de Elixir e Erlang têm feito um trabalho realmente muito bom, sem falar no trabalho de autores de bibliotecas e livros
Nunca fiquei tão ansioso por um lançamento. Acompanhei commits de Elixir e OTP por um tempo, e a sensação é de que Elixir/Erlang definitivamente ganharam tração
Estou usando Elixir no backend de um projeto paralelo, e o frontend é em Remix; trabalhar no backend tem sido muito agradável e produtivo
Reconheço a produtividade do LiveView, mas no meu caso preciso lidar com conexões de rede instáveis, então, como esperado, a experiência com LiveView não foi boa
Gostaria que, na cabeça dos desenvolvedores, Elixir fosse um pouco mais separado de LiveView. Mesmo usado só como um backend de API simples, sem LiveView nem canais em tempo real, Elixir é realmente divertido
Mas não me dou bem com LiveView. É bem difícil de entender e há muitas armadilhas pelo caminho. Por exemplo, às vezes é preciso lembrar de tratar verificações de autenticação tanto no
pipe_throughdo roteador quanto no callbackon_mountdo LiveView. Veja [0]O simples fato de a frase acima não significar nada para um desenvolvedor que está começando com Phoenix e LiveView já é prova suficiente de que LiveView não deveria ser o modo padrão
Isso cria uma curva de aprendizado muito íngreme onde ela não é necessária. Elixir/Phoenix em si é fácil
Para um desenvolvedor aprendendo Elixir/Phoenix agora, acho que a sequência certa é primeiro usar as dead views do Phoenix no estilo MVC e, depois, ler “Elixir in Action” para aprender o básico de OTP. O livro é fácil, abriu meus olhos e mudou quase tudo no meu jeito de programar
Só então acho melhor passar para LiveView
[0]: https://hexdocs.pm/phoenix_live_view/security-model.html#liv...
mix phx.newcom a flag—no-live, pode usar Phoenix sem LiveView. Em projetos existentes, também dá para removê-lo manualmenteO problema não é conhecimento técnico nem padrões de instalação, mas a percepção dos desenvolvedores. Muita gente pensa em Elixir e no restante do ecossistema a partir de LiveView, e acaba ignorando todo o resto
Elixir é muito mais do que isso, e até Phoenix é maior que LiveView
Dá perfeitamente para criar aplicações Elixir produtivas e eficientes em custo mesmo sem LiveView e, claro, até sem Phoenix. Escolher Elixir no backend deveria ser mais comum do que é hoje, mas também entendo os lugares-comuns e os receios que levam a outras escolhas
Estou construindo minha startup com Elixir 100% full-stack, e é a melhor tecnologia que já usei até agora
Fico evangelizando para meus amigos técnicos mais sérios sobre o quanto ela é boa
Agora seria ótimo se RabbitMQ e seu cliente rodassem no OTP 27. Quero fazer o upgrade
Usamos login de clientes com certificados SSL há anos e estamos muito satisfeitos com a estabilidade
Por mais elogios que eu faça a Elixir e Phoenix, ainda é pouco. Com tipos chegando agora, vai ficar ainda melhor
Você vai ouvir muito sobre a BEAM e seu poder, mas, pela minha experiência, dá para ir muito longe antes de chegar ao ponto em que precisa pensar nessa parte da stack. Phoenix abstrai isso muito bem, então você obtém os benefícios sem esforço
Um exemplo é o Oban. Dentro do Postgres, você ganha tarefas em segundo plano poderosas, flexíveis e fáceis de usar, escritas em código Elixir, quase de graça. É realmente impressionante
Recomendo experimentar
Por causa do LiveView e da obsessão de marketing ao redor dele, pessoas que, de outra forma, poderiam passar mais tempo sem conhecer OTP acabam encontrando OTP muito cedo na jornada, talvez já na primeira rota de controller
Escrever e testar bem um fluxo robusto em LiveView é tão intelectualmente complexo quanto escrever um GenServer stateful com vários fluxos não lineares e diversos pontos de entrada via call/cast
LiveView usa outros termos e tem pequenas camadas de conveniência, como async assigns, mas mecanicamente ele é literalmente um GenServer. Acho importante entender bem isso para usá-lo de forma eficaz
Gosto muito do Oban e sinto muita falta dele em outros ecossistemas
À parte: alguém já usou elixir-desktop [1]? É um pacote de wxWidgets + LiveView, então é bem parecido com um app Electron
Em [2], Wojtek Mach explica como a equipe do Elixir criou o Livebook Desktop. Ele cobre como o projeto começou, bugs sutis descobertos ao criar o app para macOS, limitações do wxWidgets no Windows e vários detalhes de implementação
Seria bom se a equipe do Elixir lançasse oficialmente algo como elixir-desktop baseado no Livebook. Ou seja, fornecer um projeto de template oficial que fizesse um fork do repositório do Livebook para criar aplicações desktop baseadas em LiveView
Hoje, o Livebook é distribuído como executáveis para Windows e Mac. Que tal seguir a mesma abordagem para permitir que desenvolvedores distribuam executáveis independentes, como no Electron?
Também conheço o LiveView Native [3], mas acho que é uma direção diferente
[1] https://github.com/elixir-desktop/desktop-example-app
[2] https://www.youtube.com/watch?v=Kiw6eWKcQbg
[3] https://native.live/
Estou ansioso pelo dia em que a desculpa de que não há tipos deixará de ser um obstáculo à popularização do Elixir
Há 10 anos leio ótimas histórias sobre Elixir por aqui, e também gosto da linguagem
Mas desisti de procurar vagas em Elixir alguns anos atrás, porque os salários continuavam parecendo mais baixos do que em linguagens mainstream
Talvez seja a linguagem que eu mais queira usar, mas, para mim, salário e um produto interessante são mais importantes do que a stack tecnológica, então talvez eu acabe não trabalhando com ela de fato. Ainda assim, continua sendo divertido acompanhar de longe
Fico curioso se você está procurando nos EUA ou em outra região
Um bom recurso desta versão é a adição de
get_in/1, que funciona com structs. Por exemplo, dá para usar comoget_in(struct.foo.bar)Se
fooretornarnil, o acesso abarnão gera uma exceçãoPara níveis que não eram mapas comuns, era preciso usar
Access.key, assimget_in(struct, [Access.key(:foo), :bar])Esta é a última peça que eu queria. Estou ansioso pelos próximos passos
Fora isso, para mim, a linguagem está funcionalmente 100% completa
Isso ainda é verdade hoje, ou não é mais necessário descer para Erlang?