2009/04/07


Rascunho da minha linguagem

Faz tempo que estou querendo inventar uma linguagem de programação. Isso aqui é um rascunho de algumas características fundamentais que ela vai ter.

Ela brota da forma como eu vejo qualquer programa: sempre apontando exatamente onde ocorrem os desvios e testes de quebra de laço... Podemos dizer que ela nasce como uma apologia ao goto! Mas não do jeito "tabu" que a instrução existe no FORTRAN e C, etc. A idéia é tornar natural escrever um "laço infinito" que possui pontos de interrupção.

Eu não gosto da forma as linguagens estruturadas fazem a gente considerar os diferentes tipos de laços como coisas muito distantes entre si, quero evidenciar as semelhanças, e como as diferenças são sutis.

E o mais importante: quantas e quantas vezes não vemos blocos do tipo "for(;;)" e "while True:" por aí? Isto não é natural. Digo, não é natural essa forma de representar isso, porque fazer esses laços é algo bem natural. Na minha linguagem o "laço infinito" será algo natural.

Um único goto no fim de um bloco pega mal porque não existe aquela sintaxe bonita marcando o ponto pra onde esse goto aponta... Eu não quaro ter "gotos selvagens", eu quero ter blocos sim.

Quero algo assim:

[
print x++
break if x>10
]

O que está dentro desses colchetes é um laço "infinito", "incondicional"... Se você não botar esse "break", não vai ter fim, e pronto.

Aquilo é um "do..while". Um "while.. do" é obtido simplesmente colocando esse teste no início...

[
break if x>10
print x++
]

Agora, podemos fazer coisas intermediárias tb.

[
x=x+y
break if x>10
y+=1
print y
]

Não sei dar agora um bom exemplo de quando isso é útil, mas já aconteceu mais de uma vez na minha vida deu ver laços com pedaços de programa repetido pra cima ou pra baixo dele, só porque o ponto de quebra do laço não podia ser no meio do bloco. Mas nessa minha linguagem isso pode acontecer naturalmente.

Em C dá pra programar assim, mas os "for(;;)" pra todo lado ficariam feio pra burro não?...

É muito comum também ver programas por aí com blocos que possuem "múltiplas terminações"... Um goto que aponta pra terminar a função de um jeito ou de outro. Isso economiza o trabalho de escrever uma funçãozinha adhoc. Quero achar um jeito bom de escrever isso tb...

1 comment:

Narcélio Filho said...

Eu gostei! Nos meus programas em C era comum que eu fizesse algo do tipo:

#define LOOP for(;;)

LOOP {
blah();
if bleh() break;
}

Já em Python é bem raro essa necessidade, já que ele lida muito bem com os iterators. Então os loops podem ser todos feitos com "for item in list:".