red programming language · como"sua linguagem faz isso em duas linhas mas a minha faz em uma","a...

15
Rascunho Red Programming Language Guaracy Monteiro 4 de Outubro de 2017

Upload: others

Post on 20-Jul-2020

20 views

Category:

Documents


0 download

TRANSCRIPT

  • Rasc

    unho

    Red Programming LanguageGuaracy Monteiro

    4 de Outubro de 2017

    https://github.com/guaracy

  • Rasc

    unho

    2

  • Rasc

    unho

    Conteúdo

    1 Introdução 51.1 Atenção . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.2 Motivos para usar Red . . . . . . . . . . . . . . . . . . . . . . 61.3 Instalação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.4 Duas por uma . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.5 Homoicônica . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.6 Variáveis são tipadas? . . . . . . . . . . . . . . . . . . . . . . 8

    2 Linguagem 112.1 Tipos de dados . . . . . . . . . . . . . . . . . . . . . . . . . . 11

    2.1.1 datatype! . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.2 unset! . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.3 none! . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.4 logic! . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.5 block! . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.6 paren! . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.7 string! . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.8 file! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.9 url! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.10 char! . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.11 integer! . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.12 float! . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.13 word! . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.14 set-word! . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.15 lit-word! . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.16 get-word! . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.17 refinement! . . . . . . . . . . . . . . . . . . . . . . . . 152.1.18 issue! . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.19 native! . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.20 action! . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.21 op! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

    3

  • Rasc

    unho

    CONTEÚDO CONTEÚDO

    2.1.22 function! . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.23 path! . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.24 lit-path! . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.25 set-path! . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.26 get-path! . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.27 routine! . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.28 bitset! . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.29 point! . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.30 object! . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.31 typeset! . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.32 error! . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.33 vector! . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.34 hash! . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.35 pair! . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.36 percent! . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.37 tuple! . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.38 map! . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.39 binary! . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.40 time! . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.41 tag! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.42 email! . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.43 handle! . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.1.44 date! . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

    2.2 Estruturas de controle . . . . . . . . . . . . . . . . . . . . . . 152.3 Parse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.4 Pré-processador . . . . . . . . . . . . . . . . . . . . . . . . . . 15

    4

  • Rasc

    unho1Introdução

    1.1 Atenção

    AtençãoLembre que Red é uma linguagem em desenvolvimento e na versão α.

    Muitas funções ainda não foram implementadas, outras estão parcialmenteimplementadas e podem conter bugs. Para ter uma melhor visão do que esperarpara a versão 1.0, você pode ver o roteiro da linguagem e andamento dodesenvolvimento. Mesmo assim, você poderá ficar espantado com o que já épossível fazer com a linguagem.

    Principais restrições:

    • Atualmente só está disponível a versão para 32 bits, o que não impedede rodar em um SO de 64 bits.

    • GUI disponível apenas para Windows e OSX. Para Android em desen-volvimento pela equipe principal. Para GTK3, testes por terceiros.

    • GC ainda não integrado a linguagem.

    Para os exemplos e documentação foi utilizado a seguinte versão: Red forLinux version 0.6.3 built 4-Oct-2017/9:29:04-03:00

    Este documentos está sendo escrito no Emacs com org-mode. Uma dasfacilidades de entrada de código para os exemplos, sua execução e apresen-tação do resultado logo a seguir. Como desvantagem, não é possível incluir

    5

    http://www.red-lang.org/p/roadmap.htmlhttps://trello.com/b/FlQ6pzdB/red-tasks-overviewhttps://toltex.u-ga.fr/RedGtk

  • Rasc

    unho

    1.2. MOTIVOS PARA USAR RED CAPÍTULO 1. INTRODUÇÃO

    texto entre o quadro de código e o dos resultados.

    1.2 Motivos para usar Red

    Apenas um: Melhorar suas habilidades de programador.

    Ficar comparando linguagens não tem muito cabimento pois, na grandemaioria das vezes, não passa de gosto pessoal. Com maior ou menor esforço,todas fazem a mesma coisa. Algumas são desenhadas para determinadastarefas e as executam com maior facilidade e menos código. Outras possuemum paradigma que você se adapta melhor. E assim vai. Não é raro opiniõescomo "Sua linguagem faz isso em duas linhas mas a minha faz em uma", "Aminha já vem com tal facilidade e a sua é necessário programar a facilidade",etc..

    Entre outras coisas que chamaram a minha atenção com Red , o parsefoi uma delas. Sempre patinei um pouco com expressões regulares, achandoparecidas com um programa em J (quem não conhece não vai achar diferençamesmo :D ). O parse de Red faz a mesma coisa e até mais com uma estruturamais legível. A facilidade de criar DSL.

    A facilidade para eu desenvolver algo sem sair do Linux, compilar e exe-cutar diretamente no Windows (outro SO) ou Raspberry Pi (outra arqui-tetura). Também existe a possibilidade de executar Red de outras lingua-gens/ferramentas, bastando ter/fazer uma interface com a biblioteca (vejaJulia utilizando Red ).

    1.3 Instalação

    Na realidade, nem é possível chamar de instalação. Basta você baixar oexecutável da página e rodar. Atualmente o download está na faixa de 1M.Na página existem outras informações, principalmente algumas dependênciasse o seu SO for de 64bits.

    No início existem os links para baixar a última versão estável (o que nãofaz muito sentido para uma linguagem alfa). No final da página existem oslinks para latest builds o que faz mais sentido. Sempre que uma nova funçãoseja incluída ou correções/alterações de funções existentes sejam efetuadas,um novo executável será gerado.

    Existe a possibilidade de trabalhar com os fontes do GitHub mas seriaapenas aconselhável para desenvolvedores ou se você deseja testar novas fun-cionalidades de outras ramificações.

    6

    http://ro settacode.org/wiki/Magic_squares_of_odd_order#Jhttps://en.wikipedia.org/wiki/Domain-specific_languagehttps://github.com/joa-quim/Red.jlhttp://www.red-lang.org/p/download.htmlhttps://github.com/red/red

  • Rasc

    unho

    CAPÍTULO 1. INTRODUÇÃO 1.4. DUAS POR UMA

    Formas de execução:

    • red : Entra no REPL (Read–Eval–Print Loop) permitindo que você di-gite comandos interativamente. Também permite a execução de outrosprogramas em Red .

    • red -c ou red -r : Compila o programa indicado. A opção -c, indi-cada para o desenvolvimento, irá gerar uma biblioeca local agilizandonovas compilações após alterações. A opção -r (release) é mais demo-rada e empacota no executável todos os dados necessários. É indicadapara distribuir o programa final sem dependências.

    • red -t : Compila para uma plataforma diferente da original, isto é,um sistema operacional/arquitetura diferente.

    • red -h : Mostra as opções disponíveis (como compilar uma bibloteca,etc.).

    A primeira execução irá demorar um pouco pois irá gerar uma algumabiblioteca que será usada pelo programa bem como a geração do console queserá executado em seguida. digite help no REPL para maiores informações.

    1.4 Duas por umaA linguagem Red é dividida (fornecida) em duas partes:

    • Red : A linguagem Red é uma linguagem de programação a versão alfa)fortemente baseada em REBOL, compartilhando basicamente, a sintaxe se-melhante, a homoiconicidade e o grande número de tipos de dados. É umalinguagem de alto nível no estilo de Ruby, Phyton, etc.. Pode ser execu-tada através do REPL (Read-Evaluation-Print-Loop), usar um arquivo comoscript ou compilada. Neste último caso, é possível em uma plataforma gerarexecutáveis para Windows, OSX, Linux e Android (futuramente iOS).

    • Red/System : É uma linguagem compilada no mesmo estilo de C mas com-partilhando a sintaxe de Red , gerando executáveis pequenos e rápidos,permitindo a criação de programas, bibliotecas ou drivers.

    1.5 HomoicônicaSimplesmente quer dizer que a representação interna e externa são as mesmas, istoé, não faz distinção entre código e dados. Apesar de parecer simples, confere grandepoder a linguagem e faz você pensar em novas formas de resolução de problemas.

    7

  • Rasc

    unho

    1.6. VARIÁVEIS SÃO TIPADAS? CAPÍTULO 1. INTRODUÇÃO

    1.6 Variáveis são tipadas?Se você leu o parágrafo anterior, a pergunta deveria ser: "Se não existe distinçãoentre código e dados, existem variáveis?" E a resposta seria: "Não." Pelo menosnão no sentido que estamos acostumados. Existem palavras que fazem referênciaa um determinado trecho existente na memória e que pode ser qualquer coisa. Sefor um trecho de código, ele poderá ser executado e produzir um resultado. Se forum dado, ele poderá ser utilizado para um determinado processamento. Os dadospossuem tipo e Red é rica em tipos. Entre outros, podemos citar inteiro, string,caractere, percentual, caminho, par, arquivo, url, rotulo, tag, hora, vetor, caminho,função, email, etc..

    Mas qual o erro você poderia cometer confundindo uma palavra com uma va-riável? Veja o trecho abaixo e o resultado produzido.

    1 teste: func [/local s] [2 s: ">"3 append s "foo"4 print s5 ]6

    7 print "Conteúdo inicial"8 probe type? :teste9 print source teste

    10 teste11 print "Conteúdo após a execução"12 print source teste

    Conteúdo inicialfunction!teste: func [/local s][s: ">"

    append s "foo"print s

    ]

    >fooConteúdo após a execuçãoteste: func [/local s][s: ">foo"

    append s "foo"print s

    ]

    Na linha 1 dizemos que a palavra teste aponta (os dois pontos após a palavra écomo fazemos a atribuição) para um trecho do código que é uma função. Na linha2 , a palavra s aponta para um trecho do código que é uma string ">". Utilizando oconceito de variável como o conhecemos, a operação da linha 3 apenas adicionaria

    8

  • Rasc

    unho

    CAPÍTULO 1. INTRODUÇÃO 1.6. VARIÁVEIS SÃO TIPADAS?

    a string foo ao conteúdo da variável. Como s aponta para um endereço do código,o que fazemos foi adicionar a string ao trecho do código. Para a avaliação correta,deveria ser utilizada a forma s: copy ">". O mesmo não acontece com dadosnuméricos (e alguns outros) que são mantidos na pilha. Mas não se preocupe comisto agora. Tem muita coisa pela frente.

    9

  • Rasc

    unho

    1.6. VARIÁVEIS SÃO TIPADAS? CAPÍTULO 1. INTRODUÇÃO

    10

  • Rasc

    unho2Linguagem

    2.1 Tipos de dadosNão é porque a linguagem não diferencia dados de código que ela não possui tiposde dados. Pelo contrário, seja para facilitar o trabalho do programador ou paraconferir uma maior legibilidade ao programa, existe uma entensa gama de tipos.

    É possível definir funções com tipagem dinâmica ou estática, isto é, podemosnão indicar o tipo dos parâmetros e a linguagem não fará nenhuma checagemno momento da chamada. Apenas irá verificar a possibilidade da operação nomomento em que ela for efetuada. Também é possível definir o tipo dos argumentosna declaração da função. Neste caso, se no momento da chamada algum parâmetronão for conpatível, será acusado um erro.

    Abaixo, definimos uma função soma-din: func[a b] que aceitará qualquervalor como parâmetros sem acusar nenhum erro durante a chamada. O erro só éacusado quando a operação a + b for executada.

    1 print "Função sem tipagem dos parâmetros"2 soma-din: func[a b][3 a + b4 ]5 print soma-din 1 26 print soma-din 1.5 2.87 print soma-din "yu" "yu"

    11

  • Rasc

    unho

    2.1. TIPOS DE DADOS CAPÍTULO 2. LINGUAGEM

    Função sem tipagem dos parâmetros34.3,*** Script Error: + does not allow string! for its value1 argument,*** Where: +,*** Stack: soma-din

    Só por curiosidade, help + irá mostrar mais informações sobre a função (nocaso operador) e podemos ver que não aceita string como argumento.

    1 help +

    USAGE:value1 + value2

    DESCRIPTION:Returns the sum of the two values.

    \begin{itemize}\item is an op! value.\end{itemize}

    ARGUMENTS:value1 [number! char! pair! tuple! vector! time! date!]value2 [number! char! pair! tuple! vector! time! date!]

    RETURNS:[number! char! pair! tuple! vector! time! date!]

    Em uma função onde definimos o tipo dos parâmetros como soma-tip: func[a[integer! percent!] b [integer! percent!]], se for chamada com algumargumento que não seja integer ou percent, irá gerar um erro antes de sua execução.O erro é acusado no momento da chada da função.

    1 print "Função com tipagem dos parâmetros"2 soma-tip: func[a [integer! percent!] b [integer! percent!]][3 a + b4 ]5 print soma-tip 1 26 try [print soma-tip 1.4 5]

    Função com tipagem dos parâmetros3,*** Script Error: soma-tip does not allow float! for its a argument

    12

  • Rasc

    unho

    CAPÍTULO 2. LINGUAGEM 2.1. TIPOS DE DADOS

    ,*** Where: soma-tip,*** Stack: soma-tip

    print soma-tip 1.4 5

    13

  • Rasc

    unho

    2.1. TIPOS DE DADOS CAPÍTULO 2. LINGUAGEM

    14

  • Rasc

    unho

    CAPÍTULO 2. LINGUAGEM 2.2. ESTRUTURAS DE CONTROLE

    2.1.1 datatype!

    2.1.2 unset!

    2.1.3 none!

    2.1.4 logic!

    2.1.5 block!

    2.1.6 paren!

    2.1.7 string!

    2.1.8 file!

    2.1.9 url!

    2.1.10 char!

    2.1.11 integer!

    2.1.12 float!

    2.1.13 word!

    2.1.14 set-word!

    2.1.15 lit-word!

    2.1.16 get-word!

    2.1.17 refinement!

    2.1.18 issue!

    2.1.19 native!

    2.1.20 action!

    2.1.21 op!

    2.1.22 function!

    2.1.23 path!

    2.1.24 lit-path!

    2.1.25 set-path!

    2.1.26 get-path!

    2.1.27 routine!

    2.1.28 bitset!

    2.1.29 point!

    2.1.30 object!

    2.1.31 typeset!

    2.1.32 error!

    2.1.33 vector!

    2.1.34 hash!

    2.1.35 pair!

    2.1.36 percent!

    2.1.37 tuple!

    2.1.38 map!

    2.1.39 binary!

    2.1.40 time!

    2.1.41 tag!

    2.1.42 email!

    2.1.43 handle!

    2.1.44 date!

    2.2 Estruturas de controle

    2.3 Parse

    2.4 Pré-processador

    15

    IntroduçãoAtençãoMotivos para usar RedInstalaçãoDuas por umaHomoicônicaVariáveis são tipadas?

    LinguagemTipos de dadosdatatype!unset!none!logic!block!paren!string!file!url!char!integer!float!word!set-word!lit-word!get-word!refinement!issue!native!action!op!function!path!lit-path!set-path!get-path!routine!bitset!point!object!typeset!error!vector!hash!pair!percent!tuple!map!binary!time!tag!email!handle!date!

    Estruturas de controleParsePré-processador