Açúcar sintético

Colegas, ontem lendo um artigo sobre programação e hoje lendo um livro, me deparei duas vezes com o expressão açúcar sintético. Por exemplo: tal coisa é um açúcar sintético que faz tal coisa por baixo dos panos.

O que quer dizer essa expressão açúcar sintético?

Nao eh acucar sintetico, eh syntax sugar, ou syntactic, que seria sintatico ou sintaxe.

Agora o que significa?? Bom sao facilidades na sintaxe da linguagem para fazer certas coisas.

Por exemplo em Scala, o . nao eh necessario em alguns casos, ex:

scala> val nome = "abcde"
nome: String = abcde

scala> nome foreach println
a
b
c
d
e

//nome foreach println eh um syntax suggar para:

nome.foreach(println)

1 + 1 // eh um syntax sugar para
1.+(1)  

Deu pra entender? Sao maneiras mais curtas ou mais faceis de se escrever certas coisas.

Entendi sim, obrigado!

hahahah Isso que da ler livro traduzido para o Portugues!! hahahaha

De fato, quando ele foi procurar no Google, deve ter achado a seguinte página:

Obviamente isso não faz nenhum sentido.

Um exemplo no Java seria os for-each iterators.

for(Objeto obj : listaObjetos)
//Faz algo com obj

Em tempo de compilação isso vai virar um for (y = 0 | y < size(listaObjetos) | y++) ou entao um while com Iterator.

[quote=entanglement]De fato, quando ele foi procurar no Google, deve ter achado a seguinte página:

Obviamente isso não faz nenhum sentido. [/quote]

kk

[quote=Marky.Vasconcelos]Um exemplo no Java seria os for-each iterators.

for(Objeto obj : listaObjetos)
//Faz algo com obj

Em tempo de compilação isso vai virar um for (y = 0 | y < size(listaObjetos) | y++) ou entao um while com Iterator.

[/quote]
Fiz uma classe com esse código e outra usando for de i até size().
Olhando os códigos gerados com “javap -c <nome_classe>”, a primeira classe gerou um código com iterator e a segunda com chamadas a size() e get().

Então não seria açúcar sintático, certo?

[quote=Schuenemann]
Fiz uma classe com esse código e outra usando for de i até size().
Olhando os códigos gerados com “javap -c <nome_classe>”, a primeira classe gerou um código com iterator e a segunda com chamadas a size() e get().[/quote]
Se não me engano é assim:

Isso:

Collection<MyClass> col = //..... considere qualquer herdeiro de Collection for (MyClass elem : col) { dosomething(elem); }
vira isso:

Collection<MyClass> col = //..... for (Iterator<MyClass> iter = col.iterator(); iter.hasNext(); ) { MyClass elem = iter.next(); dosomething(elem); }

E isso:

MyClass[] array = //..... for (MyClass elem : array) { dosomething(elem); }
vira isso:

MyClass[] array = //..... for (int i = 0; i < array.length ; ++i) { elem = array[i]; dosomething(elem); }