项目作者: potigol

项目描述 :
Site da Linguagem Potigol
高级语言: JavaScript
项目地址: git://github.com/potigol/potigol.github.io.git
创建时间: 2013-05-02T15:14:23Z
项目社区:https://github.com/potigol/potigol.github.io

开源协议:

下载


Potigol é …

Uma linguagem moderna (funcional) para aprender a programar.

Experimente online: Open in Gitpod

Editor Potigol


Faça o Download e veja como Instalar

Conheça também a biblioteca de jogos 2D Jerimum :video_game:

Características

  • Projetada para ser usada por alunos iniciantes
  • Tipagem estática com inferência de tipos
  • Palavras-chave em português
  • Multiparadigma
  • Estímulo ao paradigma funcional: valores imutáveis, casamento de padrões, funções como valores

Como usar

  • Verifique se Java está instalado digitando java -version. Se der uma mensagem de erro é preciso fazer o download em https://www.java.com/pt_BR/download e instalar.
  • Baixe a versão mais recente do Potigol https://github.com/potigol/Potigol/releases/latest
  • Descompacte o arquivo
  • Para executar o Editor de Código digite no prompt do terminal

    java -jar epotigol.jar

  • No Windows basta executar epotigol.bat.

  • Para executar um programa em Potigol digite no prompt do terminal

    java -jar potigol.jar arquivo.poti

  • No Windows basta usar potigol arquivo.poti.

Exemplos: https://github.com/potigol/Potigol/wiki/jogos

A Linguagem

Variáveis

  1. x = 10 # Declaração de um valor fixo (não pode ser alterado)
  2. y, z = 20 # Mais de uma variável recebe o mesmo valor y = 20 e z = 20
  3. a, b, c = 1, 2, 3 # Declaração paralela: a = 1, b = 2 e c = 3
  4. var y := 10 # Declaração de uma variável alterável
  5. y := y + 2 # Atribuição de um valor a uma variável
  6. var a, b, c := 1, 2, 3 # Declaração paralela: var a := 1, var b := 2 e var c := 3
  7. a, b, c := b, a, 4 # Atribuição paralela: a := 2, b := 1 e c := 4

Tipos Básicos

Tipo Valores
Inteiro -4, 0, 5, …
Real -7.23, 0.0, 5.25, …
Texto "texto", "ola", "mundo", …
Lógico verdadeiro e falso
Caractere 'a', '4', '&', …

Operações Aritméticas

  1. 5 + 3 # Soma: 8
  2. 5 - 3 # Subtração: 2
  3. 5 * 3 # Multiplicação: 15
  4. 5 / 3 # Divisão real: 1.66667
  5. 5 div 3 # Divisão inteira: 1
  6. 5 mod 3 # Resto da divisão: 2

Operações Lógicas e Relacionais

  1. # Valores lógicos: verdadeiro, falso
  2. verdadeiro e falso # e lógico : falso
  3. verdadeiro ou falso # ou lógico : verdadeiro
  4. não verdadeiro # não lógico : falso
  5. 2 == 3 # teste de igualdade : falso
  6. 2 <> 3 # teste de desigualdade : verdadeiro
  7. 2 < 3 # menor : verdadeiro
  8. 2 <= 3 # menor ou igual : verdadeiro
  9. 2 > 3 # maior : falso
  10. 2 >= 3 # maior ou igual : falso

Entrada

  1. a = leia_inteiro # lê um número inteiro do teclado
  2. b = leia_real # lê um número real do teclado
  3. c = leia_texto # lê um texto do teclado
  4. x, y = leia_inteiro # lê 2 inteiros, o mesmo que x = leia_inteiro, y = leia_inteiro
  5. números = leia_inteiros(5) # lê um lista de 5 números inteiros, um por linha
  6. números = leia_inteiros(",") # lê uma lista de números inteiros separados por vírgula

Saída

  1. escreva "Olá Mundo" # Escreve e passa para a próxima linha
  2. imprima "Olá " # Escreve e continua na mesma linha
  3. escreva "Mundo"
  4. nome = "Mundo"
  5. escreva "Olá {nome}!" # "Olá Mundo!"

Se

  1. x = leia_inteiro
  2. # se ... então ... fim
  3. se x > 5 então
  4. escreva "Maior do que cinco."
  5. fim
  6. # se ... então ... senão ... fim
  7. se x > 5 então
  8. escreva "Maior do que cinco."
  9. senão
  10. escreva "Menor ou igual a cinco."
  11. fim
  12. se verdadeiro então # escreva "verdadeiro"
  13. escreva "verdadeiro"
  14. senão
  15. escreva "falso"
  16. fim
  17. se falso então # escreva "falso"
  18. escreva "verdadeiro"
  19. senão
  20. escreva "falso"
  21. fim
  22. # se ... então ... senãose ... senão ... fim
  23. se x > 8 então
  24. escreva "Maior do que oito."
  25. senãose x > 6 então
  26. escreva "Maior do que seis."
  27. senãose x > 4 então
  28. escreva "Maior do que quatro."
  29. senãose x > 2 então
  30. escreva "Maior do que dois."
  31. senão
  32. escreva "Menor ou igual a dois."
  33. fim
  34. # usando se como uma expressão
  35. a = se x mod 2 == 0 então "par" senão "ímpar" fim
  36. maior = se a >= b e a >= c então a senãose b > c então b senão c fim

Escolha

  1. x = leia_inteiro
  2. escolha x
  3. caso 1 => escreva "Um" # se x == 1
  4. caso 2 => escreva "Dois" # se x <> 1 e x == 2
  5. caso 3 => escreva "Três" # se x <> 1 e x <> 2 e x == 3
  6. caso _ => escreva "Outro valor" # se x <> 1 e x <> 2 e x <> 3
  7. fim
  8. # escolha com condições
  9. escolha x
  10. caso n se n < 0 => escreva "{n} é negativo"
  11. caso n se n mod 2 == 0 => escreva "{n} é par"
  12. caso n => escreva "{n} é ímpar"
  13. fim
  14. # usando escolha como uma expressão
  15. é_zero = escolha x
  16. caso 0 => verdadeiro
  17. caso _ => falso
  18. fim
  19. sinal = escolha x # escolha retorna um número: -1, 0 ou 1
  20. caso n se n < 0 => -1
  21. caso n se n > 0 => 1
  22. caso _ => 0
  23. fim

Repetição: Para

  1. para i de 1 até 10 faça # escreve os números de 1 a 10
  2. escreva i
  3. fim
  4. var soma := 0
  5. para i de 1 até 10 faça # soma os números de 1 a 10
  6. soma := soma + i
  7. fim
  8. escreva "A soma é {soma}."
  9. para i de 1 até 10 passo 2 faça # escreve os números ímpares de 1 a 10
  10. escreva i
  11. fim
  12. # Para decrescente
  13. para i de 10 até 1 passo -1 faça # escreve os números de 10 a 1
  14. escreva i
  15. fim
  16. # Para com mais de um gerador
  17. para i de 1 até 4,
  18. j de 1 até 3 faça # escreve a tabuada {1..4} x {1..3}
  19. escreva "{i} * {j} == {i * j}"
  20. fim
  21. # Para com listas
  22. cores = ["azul", vermelho", "verde"]
  23. para cor em cores faça
  24. escreva cor
  25. fim
  26. # Para gerando uma lista
  27. numeros = para i de 1 até 5 gere i fim # [1, 2, 3, 4, 5]
  28. pares = para i de 1 até 10 se i mod 2 == 0 gere i # [2, 4, 5, 6, 8, 10]

Repetição: Enquanto

  1. var i := 0
  2. enquanto i<=10 faça # Escreve os números de 1 a 10
  3. escreva i
  4. i := i + 1
  5. fim

Funções

  1. soma(x: Inteiro, y: Inteiro) = x + y # Declaração de função em uma linha
  2. soma(x, y: Inteiro) = x + y # Agrupando parâmetros do mesmo tipo
  3. rep(a: Texto, n: Inteiro) = a * n # Funções com parâmetros de tipos diferentes
  4. a, b = leia_inteiro
  5. c = soma(a, b) # Aplicando a função
  6. escreva "{a} + {b} = {c}"
  7. soma(x, y: Inteiro): Inteiro = x + y # O tipo de retorno pode ser definido explicitamente
  8. soma(x, y: Inteiro) # Declaração de função com corpo
  9. c = x + y
  10. retorne c # A última linha tem o valor de retorno
  11. fim
  12. soma(x, y: Inteiro) # Declaração de função com corpo
  13. c = x + y
  14. c # A palavra 'retorne' é opcional
  15. fim
  16. fatorial(n: Inteiro): Inteiro # Função recursiva (tipo de retorno é obrigatório)
  17. se n <= 1 então
  18. 1
  19. senão
  20. n * fatorial(n - 1)
  21. fim
  22. fim
  23. a = leia_inteiro
  24. escreva "Fatorial de {a} é {fatorial(a)}"
  25. f(a: Inteiro)
  26. g(b: Inteiro) = b * 2 # Função interna
  27. retorne g(a) + 3
  28. fim

Tipo de parâmetros

Tipo Exemplo Aplicação
Inteiro proximo(a: Inteiro) = a + 1 proximo(3)
Real dobro(a: Real) = a * 2 dobro(3.6)
Texto inicio(s: Texto) = s.pegue(5) inicio("Olá mundo!")
Lógico negacao(a: Lógico) = não a negacao(verdadeiro)
Caractere id(c: Caractere) = c id('a')
Tupla f(a : (Inteiro, Texto)) = ... f((10,"ok"))
Lista soma(a: Lista[inteiro]) = ... soma([1,2,3,4,5])
Função f(g: (Inteiro, Inteiro) => Inteiro) = g(2,3) f((a,b) => a + b)
Classe ou Registro f(a: T) = ... f(T(...))

Tipos

Número (Inteiro e Real)

  1. 12345.qual_tipo # "Inteiro"
  2. 12345.real # 12345.0
  3. 12345.texto # "12345"
  4. 97.caractere # 'a'
  5. 12345 formato "%8d" # " 12345"
  6. 12345.678.qual_tipo # "Real"
  7. 12345.678.inteiro # 12345
  8. 12345.678.texto # "12345.678"
  9. 12345.678.arredonde # 12346
  10. 12345.678.arredonde(2) # 12345.68
  11. 123.45 formato "%.1f" # "123.4"
  12. 12345.678.piso # 12345.0 (arredonda para baixo)
  13. 12345.678.teto # 12346.0 (arredonda para cima)
  14. 12345.678.inteiro # 12345

Texto

  1. "abc".qual_tipo # "Texto"
  2. "123".inteiro # 123
  3. "12abc3".inteiro # 12
  4. "abc".inteiro # 0
  5. "abc"[2] # 'b' (caractere na posição 2)
  6. "12.3".real # 12.3
  7. "12a.3".real # 12.0
  8. "abc".real # 0.0
  9. "ab" + "cd" # "abcd" (concatenação)
  10. "abcb" - "bd" # "acb" (subtração)
  11. "abc".tamanho # 3
  12. "abc".posição('b') # 2 (posição de 'b' em "abc")
  13. "abc".posição('d') # 0
  14. "abc".contém('a') # verdadeiro (testa de 'a' está em "abc")
  15. "abc".contém('d') # falso
  16. "Abc".maiúsculo # "ABC"
  17. "Abc".minúsculo # "abc"
  18. "Abc".inverta # "cbA"
  19. "cab".ordene # "abc"
  20. "abc".junte("-") # "a-b-c"
  21. "abc".junte("[", ", ", "]") # "[a, b, c]"
  22. "Um texto".divida # ["Um", "texto"]
  23. "Um texto".divida("t") # ["Um ", "ex", "o"]
  24. "Um texto".lista # ['U', 'm', ' ', 't', 'e', 'x', 't', 'o']
  25. "abc".cabeça # 'a' (primeiro caractere de "abc")
  26. "abc".cauda # "bc" ("abc" sem o primeiro caractere)
  27. "abc"ltimo # 'c' (último caractere de "abc")
  28. "abcde".pegue(3) # "abc" (primeiros 3 caracteres)
  29. "abcde".descarte(3) # "de" (sem os primeiros 3 caracteres)
  30. "abcb".selecione(letra => letra<>'c') # "abb" ("abcb" sem 'c')
  31. "abc".injete(0)((x,y) => x + y) # 294 (97 + 98 + 99)
  32. "abc".injete("")((x,y) => x + "-" + y) # "-a-b-c"
  33. "abcb".descarte_enquanto(letra => letra<>'c') # "cb" (descarte caracteres antes de 'c')
  34. "abcb".pegue_enquanto(letra => letra<'c') # "ab" (pegue caracteres antes de 'c')
  35. x = "abc".remova(2) # x = "ac" (remove o caractere na posição 2)
  36. y = "abc".insira(3, 'd') # y = "abdc" (insere 'd' na posição 2)
  37. z = "abc".insira(3, "def") # z = "abdefc" (insere "def" na posição 2)

Lista

  1. [2, 4, 6, 8, 10] # lista literal
  2. 2 :: [4, 6, 8, 10] # [2, 4, 6, 8, 10]
  3. [2, 4, 6, 8, 10].tamanho # 5
  4. [2, 4, 6, 8, 10].cabeça # 2
  5. [2, 4, 6, 8, 10].cauda # [4, 6, 8, 10]
  6. [2, 4, 6, 8, 10].último # 10
  7. [2, 4, 6, 8, 10].pegue(2) # [2, 4]
  8. [2, 4, 6, 8, 10].descarte(2) # [6, 8, 10]
  9. [2, 4, 6, 8, 10].inverta # [10, 8, 6, 4, 2]
  10. [2, 6, 8, 10, 4].ordene # [2, 4, 6, 8, 10]
  11. [2, 4, 6] + [8, 10] # [2, 4, 6, 8, 10]
  12. [2, 4, 6].junte # "246"
  13. [2, 4, 6].junte(", ") # "2, 4, 6"
  14. [2, 4, 6].junte("[", ", ", "]") # "[2, 4, 6]"
  15. a = [2, 4, 6, 8, 10]
  16. a[3] # 6
  17. a.posição(6) # 3
  18. a.posição(12) # 0
  19. a.contém(6) # verdadeiro
  20. a.contém(12) # falso
  21. a.remova(4) # [2, 4, 6, 10]
  22. a.insira(3,5) # [2, 4, 5, 6, 8, 10]
  23. Lista.imutável(5, 0) # [0, 0, 0, 0, 0]
  24. Lista.vazia[Inteiro] # [] - Lista vazia de inteiros
  25. # Matrizes e Cubos
  26. a = [[1, 2], [3, 4]] # Matriz 2x2
  27. a[2] # [3, 4]
  28. a[2][1] # 3
  29. b = Matriz.imutável(2, 2, 0) # b == [[0, 0], [0, 0]]
  30. c = Cubo.imutável(2, 2, 2, "-") # c == [[["-", "-"],["-", "-"]],[["-", "-"],["-", "-"]]]
  31. c[1][2][1] # "-"
  32. # Listas mutáveis
  33. a = Lista.mutável(5, 0) # [0, 0, 0, 0, 0].mutável
  34. a[3] := 5 # a == [0, 0, 5, 0, 0].mutável
  35. # Funções de alta-ordem
  36. [2, 4, 6, 8, 10].selecione(n => n mod 4 == 0) # [4, 8]
  37. [2, 4, 6, 8, 10].mapeie(n => n div 2) # [1, 2, 3, 4, 5]
  38. [2, 4, 6].injete(0)((a, b) => a + b) # 0 + 2 + 4 + 6 == 12
  39. [2, 4, 6].injete((a, b: Inteiro) => a + b) # 2 + 4 + 6 == 12
  40. [2, 4, 6, 2, 4].pegue_enquanto(n => n < 6) # [2, 4]
  41. [2, 4, 6, 2, 4].descarte_enquanto(n => n < 6) # [6, 2, 4]

Tupla

  1. t = (2015, "potigol", 1.0) # Tupla do tipo (Inteiro, Texto, Real)
  2. t.primeiro # 2015
  3. t.segundo # "potigol"
  4. t.terceiro # 1.0

Funções Matemáticas

  1. PI
  2. sen(3.14)
  3. cos(3.14)
  4. tg(1)
  5. arcsen(1)
  6. arccos(1)
  7. arctg(1)
  8. abs(-2.4) # 2.4
  9. raiz(9) # 3.0
  10. log(2)
  11. log10(2)
  12. aleatório() # número aleatório entre 0 e 1
  13. aleatório(10) # número aleatório entre 1 e 10
  14. aleatório(1, 6) # número aleatório entre 1 e 6
  15. aleatório([2, 4, 6, 8, 10]) # número aleatório pertencente à lista [2, 4, 6, 8, 10]

Programação Orientada a Objetos

Classes são definidas através de tipos. Os tipos são compostos por atributos e métodos (funções). Todos elementos de um tipo são públicos, mas não é possível alterar diretamente um atributo.

Declaração de um Tipo (Classe)

  1. tipo «Tipo»
  2. «[var «lista de atributos do construtor» : «tipo»
  3. «[var «atributos» = «valor»
  4. «métodos»
  5. fim
  6. «obj» = «Tipo»(«lista de valores do construtor»)
  7. «obj».«atributo»
  8. «obj».«método»

Exemplo

  1. tipo Quadrado
  2. lado: Real
  3. area() = lado * lado
  4. perimetro() = 4 * lado
  5. fim
  6. q1 = Quadrado(10)
  7. escreva q1.area
  8. escreva q1.perimetro

Programação Funcional

Valores (constantes)

  1. nome = "potigol"

Listas

  1. lista1 = [1,2,3,4]
  2. lista2 = 0::lista1

Operações com listas (filter, fold, map)

  1. numeros = [1, 2, 3, 4, 5, 6, 7, 8]
  2. pares = numeros.selecione(n => n mod 2 == 0) # filtro
  3. soma = numeros.injete(0)((a,b) => a + b) # fold
  4. dobro = numeros.mapeie(n => n * 2) # map

Expressões lambda

  1. x = (a: Inteiro) => a * 2
  2. escreva x(4)

“list comprehension”

  1. y = para i de 1 até 10,
  2. j de i + 1 até 10 gere
  3. i+j
  4. fim
  5. escreva y

Funções de Alta ordem

  1. f(g: Inteiro => Inteiro, a: Inteiro) = g(a)
  2. sucessor(n: Inteiro) = n + 1
  3. escreva f(sucessor, 5)

Currying

  1. soma(a: Inteiro) = ((b: Inteiro) => a + b)
  2. escreva soma(2)(3)
  3. suc = soma(1)
  4. escreva suc(4)

Recursão em cauda otimizada

  1. h(a, cont: Inteiro): Inteiro = escolha a
  2. caso 0 => cont
  3. caso n => h(a-1, cont+1)
  4. fim
  5. escreva h(1000,0)

Casamento de Padrões

  1. # QuickSort
  2. quicksort(num: Lista[Inteiro]): Lista[Inteiro] =
  3. escolha num
  4. caso [] => []
  5. caso pivo::resto =>
  6. menores = resto.selecione( _ <= pivo )
  7. maiores = resto.selecione( _ > pivo )
  8. quicksort(menores) + pivo::quicksort(maiores)
  9. fim
  10. escreva "Digite alguns números separados por espaços"
  11. numeros = leia_inteiros(" ")
  12. escreva "Os números ordenados:"
  13. escreva quicksort(numeros)