associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

Diferenças para "LinguagemSucuri"

Diferenças entre as versões de 3 e 4
Revisão 3e 2008-03-03 01:01:49
Tamanho: 3307
Comentário:
Revisão 4e 2008-03-03 01:43:14
Tamanho: 4588
Comentário:
Deleções são marcadas assim. Adições são marcadas assim.
Linha 25: Linha 25:
#!python
Linha 31: Linha 30:
    ('and', 'e'),
    ('as', 'como'),
Linha 39: Linha 36:
    ('elif', 'senãose'),
    ('else', 'senão'),
    ('elif', 'senaose'),
    ('else', 'senao'),
Linha 44: Linha 41:
    ('for', 'para'),
    ('from', 'de'),
Linha 47: Linha 42:
    ('if', 'se'),
Linha 49: Linha 43:
    ('in', 'em'),
    ('is', 'é'),
Linha 52: Linha 44:
    ('not', 'não'),
    ('or', 'ou'),
Linha 60: Linha 50:
    ('yield', 'produzir'),
    # os comandos mais curtos tem que ser processados depois dos mais longos
    # para evitar que 'e' seja substituido antes de 'finalmente'
    ('as', 'como'),
    ('for', 'para'),
    ('not', 'nao'),
Linha 61: Linha 57:
    ('yield', 'produzir'),     ('or', 'ou'),
    ('if', 'se'),
    ('in', 'em'),
    ('is', 'eh'),
    ('from', 'de'),
    ('and', 'e'),
Linha 67: Linha 68:
        saida = entrada         utf_reader = codecs.getreader('utf8')
        saida = entrada
        # saida, n = utf_reader.decode(entrada, erros)
Linha 69: Linha 72:
            trad += ' '
if trad in saida:
                saida = saida.replace(trad, orig+' ')
            if trad+' ' in saida:
                saida = saida.replace(trad+' ', orig+' ')
                         if trad+':' in saida:
                saida = saida.replace(trad+':', orig+':')
Linha 79: Linha 84:

# eis como daria para traduzir as funções embutidas:
Linha 94: Linha 96:

Experimente, funciona!

== Ajude a Sucuri ==

Os programas desta página podem ser obtidos no Googlecode:

http://code.google.com/p/propython/source/browse/pyintro/sucuri/

Ainda não consegui fazer funcionar este exemplo:

{{{
# coding: sucuri

para i em faixa(20):
    se nao i % 2:
        exibir i, 'eh multiplo de 2',
        se nao i % 3:
            exibir 'e de 3'
        senao:
            exibir
    senaose i % 3:
        exibir i, 'eh multiplo de 3'
    senao:
        exibir i
}}}

Está dando um erro de sintaxe, e não sei como depurar um codec::

{{
$ python -c "import sucuri_dec; import se"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "se.py", line 8
    elif:
        ^
SyntaxError: invalid syntax

}}

Além disso, eu gostaria que Sucuri permitisse o uso de acentos, mas para isso preciso encadear dois codecs, e ainda não descobri como.

Se quiser ajudar, escreva para ramalho no serviço de e-mail do Google!
Linha 108: Linha 153:

A sucuri é uma cobra constritora comum no Brasil. É também o nome desta brincadeira: traduzir a linguagem Python para o português.

Exemplo: fibonacci.py

   1 # coding: sucuri
   2 
   3 def fibonacci(a=1, b=1): 
   4     enquanto 1: 
   5         produzir a 
   6         a, b = b, a+b
   7 
   8 t = fibonacci()
   9 para i em faixa(100): 
  10     exibir t.next()

O comentário especial coding: sucuri faz com que o interpretador Python invoque o nosso codec para pré-processar o programa-fonte.

O codec: sucuri_dec.py

# coding: utf-8

import codecs

RESERVADAS = (
    ('assert', 'assegurar'),
    ('break', 'interromper'),
    ('class', 'classe'),
    ('continue', 'continuar'),
    ('def', 'def'),
    ('del', 'apagar'),
    ('elif', 'senaose'),
    ('else', 'senao'),
    ('except', 'exceto'),
    ('exec', 'exec'),
    ('finally', 'finalmente'),
    ('global', 'global'),
    ('import', 'importar'),
    ('lambda', 'lambda'),
    ('pass', 'passar'),
    ('print', 'exibir'),
    ('raise', 'levantar'),
    ('return', 'devolver'),
    ('try', 'tentar'),
    ('while', 'enquanto'),
    ('yield', 'produzir'),
    # os comandos mais curtos tem que ser processados depois dos mais longos
    # para evitar que 'e' seja substituido antes de 'finalmente'
    ('as', 'como'), 
    ('for', 'para'),
    ('not', 'nao'),
    ('with', 'com'),
    ('or', 'ou'),
    ('if', 'se'),
    ('in', 'em'),
    ('is', 'eh'),
    ('from', 'de'),
    ('and', 'e'),
)


class StreamReader(codecs.StreamReader):
    def decode(self, entrada, erros='strict'): 
        utf_reader = codecs.getreader('utf8')
        saida = entrada
        # saida, n = utf_reader.decode(entrada, erros)
        for orig, trad in RESERVADAS:
            if trad+' ' in saida:
                saida = saida.replace(trad+' ', orig+' ')
            
            if trad+':' in saida:
                saida = saida.replace(trad+':', orig+':')
        return unicode(saida), len(entrada)

def get_my_codec(name):
    if name == 'sucuri':
        return (codecs.utf_8_encode, None, StreamReader, None)

codecs.register(get_my_codec)
__builtins__['tam'] = len
__builtins__['faixa'] = range

Exemplo de uso

Para usar o codec, é preciso invocar o script a partir da linha de comando, desta maneira:

$ python -c "import sucuri_dec; import fibonacci"

Experimente, funciona!

Ajude a Sucuri

Os programas desta página podem ser obtidos no Googlecode:

http://code.google.com/p/propython/source/browse/pyintro/sucuri/

Ainda não consegui fazer funcionar este exemplo:

# coding: sucuri

para i em faixa(20):
    se nao i % 2:
        exibir i, 'eh multiplo de 2',
        se nao i % 3:
            exibir 'e de 3'
        senao:
            exibir
    senaose i % 3:
        exibir i, 'eh multiplo de 3'
    senao:
        exibir i

Está dando um erro de sintaxe, e não sei como depurar um codec::

{{ $ python -c "import sucuri_dec; import se" Traceback (most recent call last):

  • File "<string>", line 1, in <module> File "se.py", line 8

    • elif:
      • ^

SyntaxError: invalid syntax

}}

Além disso, eu gostaria que Sucuri permitisse o uso de acentos, mas para isso preciso encadear dois codecs, e ainda não descobri como.

Se quiser ajudar, escreva para ramalho no serviço de e-mail do Google!

Motivação e utilidade

Este experimento foi inspirado pelo blog do Benji York da Zope Corp:

http://benjiyork.com/blog/2008/02/programmable-python-syntax-via-source.html

É um uso criativo da infra-estrutura de codecs criada para pré-processar arquivos-fonte em Python, de acordo com o PEP-0263 (http://www.python.org/dev/peps/pep-0263/).

Não sei se isso tem algum valor pedagógico, até porque não sou um defensor do Portugol e abordagens semelhantes, porque não acho que decorar algumas palavras em inglês seja o maior obstáculo para brasileiros aprendendo a programar.

O pulo do gato é aprender a pensar como programador, e isso não é uma questão de memorização, mas sim de prática em resolução de problemas. Uma linguagem ágil e versátil como Python é muito mais motivante, porque permite apresentar uma gama muito maior de problemas interessantes para serem resolvidos, que se seriam demasiadamente complicados ou demais em um dialeto de Pascal ou C.

Mas talvez entre Python e Portugol, a melhor opção para primeira linguagem seja mesmo Sucuri...


LucianoRamalho, inspirado por Benji York