Neste mês de dezembro acabei escrevendo uma ferramenta um tanto quanto interessante, ao qual chamei de Inliner e que permite escrever programas em BASIC de um “jeito bonito” a partir de qualquer editor de textos sem a preocupação com numeração de linhas e todo o resto pois ela cuidará disto para você.
Funcionalidades
O Inliner não altera a sintaxe da linguagem BASIC mas adiciona alguns recursos novos para melhorar a documentação dos programas por garantir um uso mais extensivo de comentários (que podem ou não ser exportados após a conversão), a legibilidade ao permitir que comandos longos sejam quebradas e até melhorar a manutenção com o uso de definições que podem funcionar como constantes — reduzindo assim a ocorrência de magic numbers — ou então pequenas macros.
Programa de exemplo
Para dar uma ideia de como o Inliner funciona, um programa de exemplo para MSX2:
https://gist.github.com/plainspooky/5f36156a3fc27b455fef343d59d1e77f#file-kaleidoscope-bas
Após ser convertido pelo inliner ele fica assim:
10 ' Kaleidoscope (MSX2 256 colors) 20 COLOR 15,0,0:SCREEN 8:I%=RND(-TIME) 30 FOR I%=0 TO 255 STEP 2:K%=256*RND(1):LINE (0,0)-STEP(I%,211),K%:LI NE (0,211)-STEP(I%,-211),K%:LINE (255,0)-STEP(-I%,211),K%:LINE (255,2 11)-STEP(-I%,-211),K%:NEXT I%:GOTO 30
E aí podendo ser executado em qualquer MSX2 ou rapidamente testado no MSX-Pen.
Finalizando
O Inliner está disponível no GitHub, além do programa propriamente dito há documentação detalhada e uma série de programas de exemplo — correções e adições são muito bem vindas — e em meu blog há outra publicação onde detalhei um pouco mais os recursos da ferramenta para quem ficou interessado.
Excelente idéia e iniciativa. Parabéns!
Seguindo o mesmo racioncínio daria para criar um parser que pegaria um código base parecido (poderia chamar de Basic#?) e geraria código basic válido para várias plataformas.
Fiquei até pensando em criar uma ide em moderna para fazer esse parsing de programas já integrada com emuladores para resultado.
Já viajei na maionese e pensei numa biblioteca de funções que poderiam ser importadas, static code analyzer, optimization, asm compiler, debugger via integração com emulador, (desculpe – maconha estragada aqui)…
Talvez isso daria um folego extra para a retrocomputação pois permitiria a criação de programas mais complexos com basic além da comodidade de programar num pc ou mac (imagina integração com github! desculpe, me empolguei de novo).
Obrigado! Confesso que no começo eu pensei em coisas assim, em implementar swtich/case, do/while mas depois eu sosseguei um pouco com a ideia pois aumentaria a complexidade da ferramenta e também alteraria a sintaxe do(s) BASIC — aliás, exceto pelo uso dos {{ … }} para associar a numeração das linhas a linguagem não sofre alterações — o que poderia causar alguma confusão. Mas nada impede que a saída do programa possa ser mexida (aliás eu ando pensando em quebrar o método de parser em dois para permitir tanto o pré quanto pós processamento.
Hmmm, vi seu programa do Kaleidoscópio e lembrei de uma época que disputava com os amigos para ver quem conseguiria criar alguma coisa interessante usando funções matemáticas e basic depois de digitar um programa enorme para desenhar um toro no MSX. Criei um programinha que desenhava uma figura simples mas interessante só usando funções trigonométricas do MSX.
Além de chamar o interesse de amigos, o programa serve para explicar funções trignométricas de forma mais interessante para alunos pentelhos. lol
Bom candidato para usar o inliner:
5 REM Edller’s math play
10 screen 2
20 pi = 3.14159265
30 for r=-pi to pi step 0.15
40 line (128,96+90*sin(r))-(128+100*cos(r),96)
50 next
60 goto 60
Gostei do programa! Mexi nele pra aumentar a performance… 🙂
https://gist.github.com/plainspooky/f3b37071c5f703b588667e25f89d61c3
Legal.
Performance é sempre importante.
Na verdade só “pensei com o dedo” quando escrevi o programa em 2 minutos para mostrar pros amigos.
Agora ficou bem melho, obrigado.
Hehehe, é que eu vi a simetria e pensei, opa, só precisa calcular um lado! Ainda mais que é nesta parte matemática que o MSX mais sofre. O MSX1 ainda sofrerá um pouco no desenho das retas que ele precisará fazer pixel a pixel enquanto que no MSX2/2+/tR ele delega a tarefa para o VDP (nada como uma implementação em hardware).
Giovanni,
Muito bacana a ferramenta.
Tomei a liberdade de divulgar no MRC: https://www.msx.org/forum/msx-talk/development/inliner-basic-with-defines-and-without-line-numbers
[]s
Danilo
Opa, obrigado! A página do projeto no GitHub está com uma documentação razoavelmente completa e num inglês razoavelmente razoável. 😀
Muito bom Giovanni! Ótimo trabalho!
Obrigado!