Me permita adicionar um pouco de contexto histórico.
O Python, tem a PEP 255 – Simple Generators (05/2001) : https://peps.python.org/pep-0255/
No texto e nas referências é citado Icon. Desenvolvida por Ralph Griswold em 1977 (baseada em SNOBOL também criada por ele por volta de 1962). Possui uma sintaxe parecida com C+Pascal. É baseada no conceito de sucesso e falha. Já tinhamos o yield. A diferença é que se chamava suspend. A conversão dos dois exemplos em Python para Icon ficariam:
procedure impar(elems)
every i:=elems do
if (i % 2) > 0 then
suspend i
end
# 1..1000, para 0 .. 1000 deveria ser 0 to 1000
every write(impar(!1000))
# suspend 1 | 2 | 3 seria mais idiomático
procedure numero()
suspend 1
suspend 2
suspend 3
end end
every i:=numero() do
write(i)
A linguagem possui alguns geradores interessantes incluídos
! (generate elements)
É um for/range
in vitaminado.
!"abcd" # retorna a,b,c,d
![1,2,7,9] # retorna 1,2,7,9
!5 # retorna 1,2,3,4,5
!5.34 # retorna 5, . ,3,4 (como transformar para string; note o ponto)
!2K # retorna 1,2, ... ,2047,2048
to [by]
basicamente o for que conhecemos
1 to 6 # retorna 1,2,3,4,5,6
1 to 6 by 2 # retorna 1,3,5
6 to 1 by -2 # retorna 6,5,4,3,2,1
1 to (10|20) # retorna 1..10, 1..20
every
É um for in
vitaminado
Para saber o dobro dos inteiros entre 1..5
every i := !5 do
writes(i*2, " ")
ou, mais idiomático
every writes(!5 * 2, " ")
find (s1, s2)
Retorna todas as ocorrências de s1 em s2
every write(find("o", "Alo Mundo!")) # 3, 9
Curiosidades
-
1 < N < 10
é uma expressão perfeitamente válida. Se N não for maior que 1, falha e aborta o resto da expressão. Se 1 for menor que N, retorna N e faz a próxima verificação. -
(x|y) > (3|4) # if x>3 or y>3 or x>4 or y>4
-
A linguagem verse do Simon Peyton-Jones inclui alguns conceitos de Icon. Na época ele disse que não conhecia Icon. Se for isso, ele reinventou a roda.
-
2 | (c := 3) | 5
: retorna 2,3,5 mas no segundo item atribui o valor 3 para a variávelc
. Python tem a pep 572 para permitir algo parecido.
Referências
Sobre Icon: https://en.m.wikipedia.org/wiki/Icon_(programming_language)
Página da linguagem na universidade do Arizona: https://www2.cs.arizona.edu/icon/
Após o falecimento do Ralph Griswold, conforme desejo dele, Icon não será mais alterada/atualizada. Existe um fork da linguagem que se chama Unicon
Tem extensão para vscode: