Executando verificação de segurança...
3

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ável c. 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:

Carregando publicação patrocinada...