tag:blogger.com,1999:blog-240461527725771502024-03-14T03:33:38.571-03:00Rebol (pt_BR)Blog sobre Rebol, Red, etc. em português.Guaracy Monteirohttp://www.blogger.com/profile/06389320848383273224noreply@blogger.comBlogger7125tag:blogger.com,1999:blog-24046152772577150.post-56944284648209778882014-10-29T17:17:00.001-02:002014-10-29T17:17:38.806-02:00Extendendo Rebol e GitHubResolvi criar um repositório no <a href="https://github.com/guaracy/rebol" target="_blank">GiHub</a> para integrar com o blog. Colocarei alguns programas, scripts e outros dados para facilitar os testes (como veremos adiante). Para quem não quer utilizar o Git, foi criada uma <a href="http://guaracy.github.io/rebol/" target="_blank">página</a> para que todo o repositório possa ser baixado. Basta clicar nos botões para baixar o repositório compactado.<br />
<br />
Algumas linguagens possuem uma função que retorna o somatório de uma lista como, por exemplo: <i>sum [1,2,3,4,5,6]</i>. Se não temos, teremos que criar e, se desejarmos, poderemos criar com algumas características especiais. Eu posso querer criar uma função para o somatório e, em algumas ocasiões, desejo saber a média aritmética da lista. Se eu não especificar o tipo de dado, poderei efetuar o somatório de número, datas, horas e outras coisas que possam ser passíveis de serem somadas. Então, vamos lá.<br />
<br />
Existem diversas formas de criar uma função em Rebo. Vamos utilizar <i>Funct</i>. A razão é que todas as variáveis criadas internamente serão locais e não influenciarão no restante do ambiente. Vejamos como ficaria:<br />
<br />
<pre><span style="color: black;"><span style="background: #cccccc; border-right: solid 2px black; margin-right: 5px;"><span style="color: maroon;"> 1 </span></span>rebol[
<span style="background: #cccccc; border-right: solid 2px black; margin-right: 5px;"><span style="color: maroon;"> 2 </span></span> Title: <span style="color: green;"><b>"</b></span><span style="color: green;"><b>Somatório</b></span><span style="color: green;"><b> </b></span><span style="color: green;"><b>de</b></span><span style="color: green;"><b> </b></span><span style="color: green;"><b>séries.</b></span><span style="color: green;"><b>"</b></span>
<span style="background: #cccccc; border-right: solid 2px black; margin-right: 5px;"><span style="color: maroon;"> 3 </span></span> Date: 28<span style="color: black;"><b>/</b></span>10<span style="color: black;"><b>/</b></span>2014
<span style="background: #cccccc; border-right: solid 2px black; margin-right: 5px;"><span style="color: maroon;"> 4 </span></span> Version: 0.1
<span style="background: #cccccc; border-right: solid 2px black; margin-right: 5px;"><span style="color: maroon;"> 5 </span></span> Autor: Guaracy
<span style="background: #cccccc; border-right: solid 2px black; margin-right: 5px;"><span style="color: maroon;"> 6 </span></span>]
<span style="background: #cccccc; border-right: solid 2px black; margin-right: 5px;"><span style="color: maroon;"> 7 </span></span>
<span style="background: #cccccc; border-right: solid 2px black; margin-right: 5px;"><span style="color: maroon;"> 8 </span></span>sum: funct [
<span style="background: #cccccc; border-right: solid 2px black; margin-right: 5px;"><span style="color: maroon;"> 9 </span></span> <span style="color: green;"><b>"</b></span><span style="color: green;"><b>Somatório</b></span><span style="color: green;"><b> </b></span><span style="color: green;"><b>de</b></span><span style="color: green;"><b> </b></span><span style="color: green;"><b>séries</b></span><span style="color: green;"><b>"</b></span>
<span style="background: #cccccc; border-right: solid 2px black; margin-right: 5px;"><span style="color: #666699;"> 10 </span></span> nums [<span style="color: #006666;"><b>block!</b></span>]
<span style="background: #cccccc; border-right: solid 2px black; margin-right: 5px;"><span style="color: maroon;"> 11 </span></span> <span style="color: black;"><b>/</b></span>average <span style="color: green;"><b>"</b></span><span style="color: green;"><b>Retorna</b></span><span style="color: green;"><b> </b></span><span style="color: green;"><b>apenas</b></span><span style="color: green;"><b> </b></span><span style="color: green;"><b>a</b></span><span style="color: green;"><b> </b></span><span style="color: green;"><b>média</b></span><span style="color: green;"><b> </b></span><span style="color: green;"><b>do</b></span><span style="color: green;"><b> </b></span><span style="color: green;"><b>somatório</b></span><span style="color: green;"><b> </b></span><span style="color: green;"><b>da</b></span><span style="color: green;"><b> </b></span><span style="color: green;"><b>série</b></span><span style="color: green;"><b>"</b></span>
<span style="background: #cccccc; border-right: solid 2px black; margin-right: 5px;"><span style="color: maroon;"> 12 </span></span> <span style="color: black;"><b>/</b></span>inject <span style="color: navy;"><b>val</b></span> <span style="color: green;"><b>"</b></span><span style="color: green;"><b>Valor</b></span><span style="color: green;"><b> </b></span><span style="color: green;"><b>para</b></span><span style="color: green;"><b> </b></span><span style="color: green;"><b>a</b></span><span style="color: green;"><b> </b></span><span style="color: green;"><b>inicialização</b></span><span style="color: green;"><b> </b></span><span style="color: green;"><b>do</b></span><span style="color: green;"><b> </b></span><span style="color: green;"><b>total</b></span><span style="color: green;"><b>"</b></span>
<span style="background: #cccccc; border-right: solid 2px black; margin-right: 5px;"><span style="color: maroon;"> 13 </span></span>][
<span style="background: #cccccc; border-right: solid 2px black; margin-right: 5px;"><span style="color: maroon;"> 14 </span></span> <span style="color: navy;"><b>either</b></span> inject [total: <span style="color: navy;"><b>val</b></span>][total: 0]
<span style="background: #cccccc; border-right: solid 2px black; margin-right: 5px;"><span style="color: maroon;"> 15 </span></span> <span style="color: navy;"><b>foreach</b></span> n nums [total: total <span style="color: black;"><b>+</b></span> n]
<span style="background: #cccccc; border-right: solid 2px black; margin-right: 5px;"><span style="color: maroon;"> 16 </span></span> <span style="color: navy;"><b>either</b></span> average[total <span style="color: black;"><b>/</b></span> <span style="color: #660e7a;"><b>length?</b></span> nums][total]
<span style="background: #cccccc; border-right: solid 2px black; margin-right: 5px;"><span style="color: maroon;"> 17 </span></span>]
</span></pre>
<br />
Nas linhas de 1 até 6 (poderia ser em uma linha mas dificultaria a legibilidade), temos o cabeçalho que é obrigatório. Poderia ser apenas no formato <i>REBOL []</i> mas as informações podem auxiliar o programador podendo até verificar se a versão é compatível com seu programa.<br />
<br />
O nome pela qual a função será chamada é <i>sum:</i> . O primeiro bloco após <i>funct</i> são as especificações da função. Colocamos uma string com uma descrição da função, o parâmetro <i>nums</i> que deverá ser um bloco ou ocorrerá um erro antes mesmo da função ser executada e dois refinadores. Se ela for chamada com <i>/average</i>, efetuará o somatório, dividirá pelo número de elementos e retorna a média aritmética em vez do somatório. Se <i>/inject</i> for especificado, deverá ser informado um valor que inicializará o total.<br />
<br />
A linha 14 temos <i>either</i> que avalia uma expressão e retorna o primeiro bloco se a expressão for verdadeira ou o segundo se for falsa (como um <i>if/then/else </i>em outras linguagens). Se foi especificado <i>/inject</i>, o total será inicializado com o valor informado ou zero se não.<br />
<br />
Na linha 15 temos o laço colocar em total a soma dos valores contidos no bloco informado para a função.<br />
<br />
Na linha 16 verificamos se o retorno deve ser o total ou a média. O último resultado da função é o valor que será retornado (mas podemos utilizar <i>return x</i> se desejarmos outro valor).<br />
<br />
A próxima parte seria integrar a nova função ao ambiente. Como coloquei no GitHub (poderia ser em um servidor da minha empresa ou outro qualquer) para demonstrar a integração com a internet. Basta executar <span style="color: orange;"><i>do <a href="https://raw.githubusercontent.com/guaracy/rebol/master/extensoes/sum.r3">https://raw.githubusercontent.com/guaracy/rebol/master/extensoes/sum.r3</a></i></span> para que a nova função faça parte do nosso repertório. Poderia também baixar e gravar o arquivo no meu computador e executar <i>do %sum.r3. </i>Mas é necessário fazer isto sempre que executamos o Rebol? Não. É possível termos um arquivo <i>rebol.r</i> no diretório que executamos o Rebol com todas as instruções que desejamos que sejam feitas na inicialização do ambiente. Colocamos o <i>do %sum.r3</i> no arquivo e sempre podemos contar com a nova função. <br />
<br />
Já podemos ver como a nossa função funciona e o motivo das informações na definição da função.<br />
<br />
<pre><span style="color: #b45f06;"><b>>> help sum
USAGE:
SUM nums /average /inject val
DESCRIPTION:
Somatório de séries
SUM is a function value.
ARGUMENTS:
nums (block!)
REFINEMENTS:
/average -- Retorna apenas a média do somatório da série
/inject
val -- Valor para a inicialização do total</b></span>
</pre>
<br />
<br />
Podemos utilizar o somatório e/ou média com qualquer valor que faça sentido como números, horas, datas, pares ordenados, etc. Note que não faz sentido a média entre duas datas. <br />
<br />
<pre><span style="color: #b45f06;"><b>>> sum [1 2 3 4 5]
== 15
>> sum/inject [1 2 3 4 5] 10
== 25
>> sum/average [1 2 3 4 5]
== 3
>> sum/average/inject [1 2 3 4 5] 10
== 5
>> sum [10:20 10:30 10:00 5:15]
== 36:05
>> sum/average [10:20 10:30 10:00 5:15]
== 9:01:15
>> sum/average/inject [10:20 10:30 10:00 5:15] 5:00
== 10:16:15
>> sum [20/10/2014 10 10 5 2 6]
== 22-Nov-2014
>> sum [20/10/2014 23:25 8:55]
== 21-Oct-2014/8:20
>> sum [2x3 6 2 3 -1 2x1]
== 14x14
>> sum [20/10/2014 2.5]
== 22-Oct-2014/12:00
>> sum [2.3 3.5 4.2 12.9]
== 22.9</b></span>
</pre>
<br />Guaracy Monteirohttp://www.blogger.com/profile/06389320848383273224noreply@blogger.com0tag:blogger.com,1999:blog-24046152772577150.post-61594871832423892882014-10-25T19:47:00.000-02:002014-10-25T19:47:33.490-02:00Tipos de dados.Podemos dizer que Rebol é uma linguagem dinâmica de tipagem forte, isto é, uma palavra (variável) poderá conter qualquer tipo de dado mas as operações não fazem a conversão de tipo automaticamente. Uma instrução do tipo: <i>"nome" + 1</i> retorna um erro<br />
<br />
Quando criamos uma função, é permitido especificar o tipo de cada argumento que ela receberá. Assim, se ela espera um tipo inteiro e recebe um tipo diferente, um erro é informado mesmo antes das operações (mesmo que elas sejam permitidas).<br />
<br />
A linguagem possui 58 tipos nativos. <br />
<br />
<code>
<span style="color: #b45f06;">>> ? system/catalog/datatypes<br /><br />
SYSTEM/CATALOG/DATATYPES is a block of value: [end! unset! none! logic! integer! decimal! percent! money! char! pair! tuple! time! date! binary! string! file! email! url! tag! bitset! image! vector! block! paren! path! set-path! get-path! lit-path! map! datatype! typeset! word! set-word! get-word! lit-word! refinement! issue! native! action! routine! rebcode! command! op! closure! function! frame! object! module! error! task! port! gob! event! callback! handle! struct! library! utype!]</span></code>
<br />
<br />
Se por um lado são muitos tipos, por outro facilitam bastante a vida do programador e dispensam a criação de funções para trabalhar com formatos específicos bem como podem melhorar a legibilidade do programa. Vejamos, superficialmente, alguns tipos:<br />
<br />
<b><span style="color: red;">logic!</span></b><br />
<br />
Armazenam valores lógicos e são utilizados em testes condicionais. Os possíveis valores para verdadeiro são <i>true</i>, <i>yes</i> e <i>on</i> e para falso são <i>false</i>, <i>no</i> e <i>off</i>. Permitem uma maior legibilidade ao código.<br />
<br />
<span style="color: red;"><b>integer!</b></span><br />
<br />
Armazenam números inteiros. É importante salientar que a divisão converte o número para decima. Por exemplo, <i>4 / 2</i> retorna <i>0.5</i>. Caso seja necessário um resultado inteiro, devemos efetuar a conversão de tipos: <i>to integer! 2 / 4 </i>retorna <i>0</i>.<br />
<br />
<span style="color: red;"><b>decimal!</b></span><br />
<br />
Armazenam valores com ponto flutuante. É possível utiliza o ponto ou a virgula para separar a parte inteira da decimal Os valores 123,45 e 123.45 são válidos e representam o mesmo número. Em números longos é possível usar o apostrofo (<b>'</b>) para separar as sequências, facilitado a leitura. Então <i>1'246'487,31</i> é um número válido. A letra <i>E</i> representa o expoente como em <i>1,23e10</i> ou <i>3,14e-208</i>. <br />
<br />
<span style="color: red;"><b>percent!</b></span><br />
<br />
Utilizado para representar percentual. <i>7% + 2% = 9%</i>. Convertendo para decimal <i>to-decimal 5% = 0.05</i>. Também está relacionado com legibilidade,<br />
<br />
<span style="color: red;"><b>money!</b></span><br />
<br />
Especifica valores financeiros e devem iniciar com o cifrão (<b>$</b>). No R3 serve apenas para ficar mais bonitinho (pelo menos por enquanto). Nas versões anteriores do Rebol, era possível especificar <i>R$12.23</i> e <i>US$5.26</i>. O programa não permitia somar os dois valores sem uma conversão.<br />
<br />
<span style="color: red;"><b>char!</b></span><br />
<br />
Informa um único caractere (letra, número ou símbolo). Deve ser seguida pelo símbolo sustenido (<b>#</b>) e o caractere entre aspas. Então <i>#"a"</i> indica o caractere a minúsculo. Existem diversas formas de criar caracteres especiais que não podem ser entrados diretamente pelo teclado. O caractere <i>Esc</i>, por exemplo, pode ser informado como <i>#"^(esc)"</i> ou <i>to-char 27</i>. É possível entrar qualquer caractere informando o seu valor hexadecimal (<i>0000</i> até <i>FFFF</i>) entre parênteses. <i>#"^(001B)"</i> ou <i>#"^(1B)"</i>. É possível algumas operações entre caracteres como somar ou subtrair um número ou outro caractere. Por exempĺo: <i>#"A" + 1 = #"B"</i>.<br />
<br />
<span style="color: red;"><b>pair!</b></span><br />
<br />
São pares ordenados (x,y) e também aceitam diversas operações e o acesso de seus valores individuais. Exemplificando a soma temos: <i>2x3 + 1 = 3x4</i> e <i>2x3 + 3x1 = 5x4</i>. Para acessar individualmente podemos usar <i>first</i> e <i>second</i> para retornar o valor de x e y. <br />
<br />
<span style="color: red;"><b>tuple!</b></span><br />
<br />
Representam versões, endereços de internet e cores no formato RGB. São três ou mais valores numérico positivos entre 0 e 255 separados por ponto. Permitem operações matemáticas e lógicas. Podemos comparar uma versão <i>1.2.120 > 1.2.2 = true</i> ou <i>1.2.120 > 1.2.200 = false</i>. Podemos calcular 20% de uma cor fazendo <i>255.128.128 * 20% = 127.64.64</i>.<br />
<br />
<span style="color: red;"><b>time!</b></span><br />
<br />
Representam tempo no formato hh:mm[:ss[.d]]. Podemos efetuar operações e os ajustes sobre minutos e segundo serão feitos automaticamente. Por exemplo: <i>10:30 + 2:42 = 13:12</i> ; <i>2:40 * 2 = 5:20</i> ; <i>0:120:70 - 0:1:2 = 2:00:08</i>.<br />
<br />
<span style="color: red;"><b>date!</b></span><br />
<br />
Representam datas e também permitem operações. Aceita uma variedade de formatos. <i>3/11/2014 + 80 = 22-Jan-2015</i> (somamos 80 dias em uma data) ; <i>1/1/2001 - 1/1/2000 = 366</i> (número de dias entre duas datas com ano bissexto levado em consideração). Se o valor estiver em uma variável, podemos selecionar apenas o dia ou ano bem como o dia da semana.<br />
<br />
<span style="color: red;"><b>binary!</b></span><br />
<br />
Armazenam dados binários que podem estar na base binária, hexa (default) ou 64. Como exemplos podemos ter: <i>#{45FA100125FA4E7C}</i> (base 16 e é necessário a representação de um byte com os dois dígitos 00-FF), <i>2#{00001111 11001100 00110011}</i> (base 2 sendo cada byte representado por 8 dígitos) e <i>64#{A465Eesq}</i> (base 64).<br />
<br />
<span style="color: red;"><b>string!</b></span><br />
<br />
Representam uma série de caracteres. Se estiver em uma linha, pode ser delimitada por aspas (<b>"</b>) ou deve ser delimitada por parênteses <b>{}</b> se utilizar mais de uma linha. Pode conter parênteses aninhados desde que o número de aberturas for igual ao número de fechamentos. Assim os parênteses serão considerados como caracteres. Para incluir um parênteses no meio, deve ser precedido por um circunflexo. Por exemplo: <i>"Nome da pessoa"</i>, <i>{Nome da pessoa}</i> , <i>{Nome {da} pessoa}</i> e <i>{Nome da^} pessoa}</i> são exemplos válidos.<br />
<br />
<span style="color: red;"><b>file!</b></span><br />
<br />
Contém o nome e ou caminho de um diretório ou arquivo. É precedido pelo símbolo de percentual (<b>%</b>). Por exemplo: <i>%./rebol/teste.r3</i> informa o arquivo <i>teste.r3</i> que se encontra no subdiretório <i>rebol</i> ao passo que <i>%teste.r3 </i>informa o nome de um arquivo que se encontra no diretório atual. Além da parte visual que permite a fácil identificação, também permite que o programa trabalhe com caminhos de forma mais transparente (<b>/</b> no linux e <b>\</b> no windows). Também permite ler o conteúdo de um arquivo apenas digitando-se <i>read %/caminho/arquivo</i> (sem a necessidade de comandos para abrir ou fechar o arquivo).<br />
<br />
<span style="color: red;"><b>email!</b></span><br />
<br />
Identifica um endereço válido de email. Ainda não está funcionando no R3. <br />
<br />
<span style="color: red;"><b>url!</b></span><br />
<br />
Identifica uma URL (Uniform Resource Locator). Não testei todos e alguns não estão disponíveis, pelo menso por enquanto, na versão R3. Como o http: deve ser o mais utilizado, para ler uma página basta executar <i>read http://www.rebol.com</i>.<br />
<br />
<span style="color: red;"><b>tag!</b></span><br />
<br />
Tags são utilizados em linguagens de marcação (html por exemplo) para o tratamento das informações. Estão entre os sinais de menor (<b><</b>) e maior (<b>></b>). <br />
<br />
<b><span style="color: red;">image!</span></b><br />
<br />
Indica que é uma imagem.Se uma variável possui uma imagem (por exemplo: <br />
<i>image: load http://kde-look.org/CONTENT/content-files/167376-kdeflames.png</i>) com <i>imagem/size</i> retorna um par informando o número de pixel na verticar e horizontal (e.g. 512x158), <i>pick posição</i> returna uma tupla com informações (RGBA) do pixel e <i>poke posição 255.0.0.0</i> irá setar o pixel como vermelho.<br />
<br /><span style="color: red;"><b>block!</b></span><br />
<br />
É um grupo de qualquer coisa delimitado por colchetes <b>[</b> e <b>]</b>. Por exemplo, <i>[10 + 20]</i> é um bloco contendo dois inteiros e uma word e pode até ser avaliado retornando <i>30</i>. Já um bloco <i>[1 2 3 4 5 6]</i> é um bloco contendo seis inteiros. É como um array (mais poderoso) em outras linguagens.<br />
<br />
Ok, vamos ficar por aqui. 58 tipos de dados é muita coisa para assimilar em pouco tempo, sem contar que alguns nem podem ser obtidos ou fazem sentido imediatamente. Por exemplo, <i>type? first [nome:]</i> retorna <i>set-word!</i>. Por enquanto, basta saber que <i>nome: 10</i>, irá colocar na palavra <i>nome</i> o valor inteiro 10.<br />
<br />Guaracy Monteirohttp://www.blogger.com/profile/06389320848383273224noreply@blogger.com0tag:blogger.com,1999:blog-24046152772577150.post-33434614679331310852014-10-23T01:12:00.000-02:002014-10-23T01:12:00.590-02:00R3. Atronix? Compilar?Como já escrevi, estou usando o R3 (REBOL versão 3) da <a href="http://atronixengineering.com/downloads.html" target="_blank">Atronix</a>. Como motivos posso citar:<br />
<ol>
<li>Assistindo ao <a href="http://www.youtube.com/watch?v=jIw7aRP6JPU" target="_blank">vídeo</a> do primeiro artigo, nota-se que é uma empresa séria que não possui apenas um funcionário e não faz programinha de brinquedo.</li>
<li>A primeira versão do sistema foi desenvolvida em Visual Basic (independente de qualquer coisa, já fiz alguns programas comerciais bem interessantes com o VB), depois passaram para Delphi (também já fiz programas comerciais com ele) e depois, analisaram python e ruby entre outros e decidiram desenvolver o sistema em REBOL. E pretendem continuar com a versão 3.</li>
<li>Deslocaram um engenheiro para trabalhar 10h semanais exclusivamente com o desenvolvimento do R3.</li>
<li>O sistema e distribuído aproximadamente 50/50 entre Linux e Windows. Como uso Linux prefiro alguém que tenha um certo compromisso com a plataforma.</li>
</ol>
A versão oficial é muito engessada pelo Carl e a versão da Saphirion parece deixar o usuário mais curioso sem resposta além de algumas páginas com problema (se vai na parte da <a href="http://development.saphirion.com/rebol/r3gui/" target="_blank">R3GUI</a> e tentar acessar <i>faces</i> ou outros retorna uma página incorreta; mas vou dar um desconto pois eles estão em férias).<br />
<br />
Olhando o <a href="https://github.com/zsx/r3/tree/atronix" target="_blank">GitHub</a> do R3, é possível verificar que ocorreram atualizações há um dia (pela data de hoje) e, inclusive, no dia 20/10/2014 tem a mensagem "<i>Add an encapper for Windows and Linux...</i>" (veremos o que é encapper depois). Opa, legal, Opa, legal. Vamos clonar o repositório e compilar uma versão atualizada. <br />
<br />
Um <span style="color: purple;"><i>git clone https://github.com/zsx/r3.git</i></span> e vamos ver o install (é sempre a primeira coisa a ser feita).<br />
<br />
<pre><span style="color: #444444;">Steps to compile Atronix (http://www.atronixengineering.com) flavor of Rebol 3
0. some directory variables:
#top points to the top directory of source
1. get libffi compiled and installed
#cd $(top)/src/libffi
#./autogen.sh
#./configure --prefix=`pwd`/../../make/libffi
#make
#make install
2. go back to top make directory
#cd $(top)/make
#make -f makefile-64 clean #ignore errors it generates
#make -f makefile-64 r3-view-linux
#possible makefiles are:
a. makefile-64 for 64-bit Linux systems
b. makefile-32 for 32-bit Linux systems
c. makefile-mingw-32 for cross-compiling for 32-bit windows systems from Linux
d. makefile-mingw-64 for cross-compileing for 64-bit windows sytems from Linux
e. makefile-armv7 for ARMv7 linux systems
Notes: only r3-view-linux is tested, i.e. r3-core-linux might not even build</span></pre>
<br />
Humm. Apenas o <i>r3-view-linux</i> é testado. É o que quero mesmo, então vamos em frente. Bem, já tenho a <i>libffi</i> mas ali diz para compilar em um sub diretório de <i>make</i>. La vai um <i>git clone git://github.com/atgreen/libffi.git</i>, <i>autogen</i>, etc e tudo termina normal. Primeiro passo ok. Agora é só um <br />
<br />
<i>make -f makefile-64 clean</i> e um <i>make -f makefile-64 r3-view-linux</i>. Aguarda e ... erro com libffi. Olhando o <i>r3/make/makefiles/linux-common-defs</i> tinha a linha <br />
<i>INC=... -Ilibffi/lib/libffi-3.1.1</i> e a biblioteca que baixei era a 3.2. Troquei <i>3.1.1 </i>por <i>3.2 </i>e um tudo funcionou perfeitamente.<br />
<br />
Bem, fica a dica para que possui Windows e OSX. Como é aberto, se a pessoa tiver conhecimento, paciência e vontade, pode clonar o repositório e tentar compilar para a sua arquitetura. Vai que tenha apenas que trocar um 3.1.1 por um 3.2? <br />
<br />
Na imagem abaixo é possível ver as alterações nos programas.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbkgke6RomkIp-m2-5OLSbchLPrNB3X0jHy6_N85EZAU5pM8r3FL2asU4Jq4N6hFmG-6HPIMmaMTqW3zqnuMxK93EUIzej46VKpjJNukNOkl7bHxk_XPA0rsQ8BAEEPjgKSq67yFmeJw/s1600/r3-linux-git.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbkgke6RomkIp-m2-5OLSbchLPrNB3X0jHy6_N85EZAU5pM8r3FL2asU4Jq4N6hFmG-6HPIMmaMTqW3zqnuMxK93EUIzej46VKpjJNukNOkl7bHxk_XPA0rsQ8BAEEPjgKSq67yFmeJw/s1600/r3-linux-git.jpg" height="450" width="640" /></a></div>
<br />
Agora é só criar uma ligação simbólica em <i>/usr/bin/r3 -> ~/fontes/r3/make/r3-view-linux</i> e usar de qualquer lugar.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibdXSxbGdVmReDVV3vtBuEKsH7nFEQYjjuQcQlX8bdMOejf4Rt4GIs_iELIRbirdXC1BRU0ju1hbfhasazrU0Xf7T7uMDFqwaPNsaOHdBwBrhPsQPQGRgtygy1nSagpTUc5ZFichA79Q/s1600/r3-linux.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibdXSxbGdVmReDVV3vtBuEKsH7nFEQYjjuQcQlX8bdMOejf4Rt4GIs_iELIRbirdXC1BRU0ju1hbfhasazrU0Xf7T7uMDFqwaPNsaOHdBwBrhPsQPQGRgtygy1nSagpTUc5ZFichA79Q/s1600/r3-linux.jpg" height="478" width="640" /></a></div>
<br />
<i>Build: 22-Oct-2014/22:13:29</i>. :D<br />
<br />
<br />
A <a href="https://github.com/zsx/r3-gui" target="_blank">R3-GUI</a> eu não me preocupei já que a última atualização foi efetuada há 8 meses. Mas pretendo clonar depois.<br />
<br />
Ah, sim, o <i>encapper</i>. Basicamente é um programa que junta o compilador e scripts e cria um executável. Abaixo podemos ver um teste.r que imprime algo sendo <i>encapsulado</i>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1AEg4ZSwxMs2Oyrs38YmDdM3zZdkAx8I9TvW0m4LIPMP6JUDsIIJNO6frIa9xhztcOA3Wpu5rXtVRb9sxyNuIbAdIIN9RcPOJrdfFXY86JFPTQk8Xj6MDEHuzRxWQMQ1yxPp1ZMFH5g/s1600/r3-linux-encap.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1AEg4ZSwxMs2Oyrs38YmDdM3zZdkAx8I9TvW0m4LIPMP6JUDsIIJNO6frIa9xhztcOA3Wpu5rXtVRb9sxyNuIbAdIIN9RcPOJrdfFXY86JFPTQk8Xj6MDEHuzRxWQMQ1yxPp1ZMFH5g/s1600/r3-linux-encap.jpg" /></a></div>
<br />
<br />
A Saphiron possui um que faz o mesmo para android, juntando tudo e
criando uma .apk. Aí é só instalar e clicar no ícone para executar. Infelizmente os fontes não estão disponíveis para uso externo. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBt7fjdc63VqGdnBVH2LpJsVQ46FKqkcxrwM9dGNgbt45lBB7M-slpjX-TY4WBDgWuQoyC19V3LXixu7B82ZQpLDHCjkArwWJSVx2MtuZhs4RTD7oGKtbLKn8V4J1-Tyj5B9Uhw_EW4g/s1600/r3-apk.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBt7fjdc63VqGdnBVH2LpJsVQ46FKqkcxrwM9dGNgbt45lBB7M-slpjX-TY4WBDgWuQoyC19V3LXixu7B82ZQpLDHCjkArwWJSVx2MtuZhs4RTD7oGKtbLKn8V4J1-Tyj5B9Uhw_EW4g/s1600/r3-apk.jpg" height="484" width="640" /></a></div>
<br />
Agora é aguardar para que um programa em R3 possa ser criado em um Linux x64 (ou qualquer outro SO) e ser gerado executáveis para Linux 34 e 64, Windows 32 e 64, OSX e Android. <br />
<br />
<br />Guaracy Monteirohttp://www.blogger.com/profile/06389320848383273224noreply@blogger.com0tag:blogger.com,1999:blog-24046152772577150.post-45003513101870406502014-10-21T19:27:00.000-02:002014-10-22T01:38:08.084-02:00REBOL + Android : Configurando um ambiente para desenvolvimento no tablet.Tenho um tablet Galaxy 10.1 que é utilizado basicamente em viagens. No resto do tempo ele fica bem paradão. Como existe uma versão de REBOL para Android, resolvi configurar um ambiente de desenvolvimento no tablet. Não é necessário nada de especial para a instalação dos programas. É possível configurar no celular mas, como não sou masoquista ...<br />
São quatro programinhas para instalar:<br />
<ol>
<li>O <a href="http://development.saphirion.com/experimental/builds/android/">r3-droid.apk</a>. É necessário baixar e instalar manualmente pois ainda não está disponível no Google Play.</li>
<li>Um teclado para quem pretende programar. O <a href="https://play.google.com/store/apps/details?id=org.pocketworkstation.pckeyboard">Hacker's Keyboard</a> é uma boa pedida. Basta acessar o link e mandar instalar.</li>
<li>Um editor de texto que possua algumas facilidades para o programador. A minha escolha recaiu sobre o <a href="https://play.google.com/store/apps/details?id=jp.sblo.pandora.jota">Jota Text Editor</a>. Também é só acessar o link e mandar instalar. Possui uma certa integração com REBOL, desde salientar a sintaxe (não é perfeita mas é melhor que nada e pode ser alterada/melhorada)até abrir o texto por uma aplicação (que pode ser escolhido o R3/Droid).</li>
<li> Como uso Linux e é mais complicado acessar os arquivos do tablet, uma solução simples seria o <a href="https://play.google.com/store/apps/details?id=com.smarterdroid.wififiletransfer">WiFi File Transfer</a> que permite a transferência dos arquivos pela rede. Também é só baixar e instalar.</li>
</ol>
E é tudo. Podem existir outros programas melhores, mas foram as opções gratuitas que eu testei. No tablet, com o novo teclado e a integração do editor é relativamente confortável a criação e execução de programas. Algumas capturas de tela para mostrar como ficou:<br />
<br />
A área de trabalho para o desenvolvimento ficou assim.O R3/Droid para testar os programas, o editor, um navegador (algumas páginas salvas na memória para recorrer em caso de dúvida) e um gerenciado de arquivos.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSPllstP72EHT2WSVh-4zx_G8IwFQm60LXPTLiSnZsVe3Zwr5tC1elOjbgeiTOJZjKeAGn_UltCuXg6nH9szGG2XLZAxUtxaoYqjIjMAuwPIWB92CFhZjcnJKrMxHKmfVya-AgthBLiA/s1600/r3-tablet-008a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSPllstP72EHT2WSVh-4zx_G8IwFQm60LXPTLiSnZsVe3Zwr5tC1elOjbgeiTOJZjKeAGn_UltCuXg6nH9szGG2XLZAxUtxaoYqjIjMAuwPIWB92CFhZjcnJKrMxHKmfVya-AgthBLiA/s1600/r3-tablet-008a.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivaMq0jCsSmXbgfPG4YSa8FjiY7PWEnPbEt1jSmx7NucTBvkQ15ZhGE4AdLN8QvKvm6MkdK8p1FK_TQ7G14UFniCerzk306WBCvKwjmfIJYw4h4lAecyvzuyc2pqf-0fmVS9ZVKBdFoQ/s1600/r3-tablet-008.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
O R3/Droid sendo executado. Mais para testes já que ele aceita apenas uma linha para ser interpretada.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUVOTfL4AKMC9Bpjr8i-Fq25GYXceS8EeyQFAizoQU10SudGqwyNG8TeidZd2jtBzn86DnPGkZ-P5miV3F9LJjcKvLC30L6ZtdgkXSfG7KQ3u9tDkCWpkgu4SpzcYSSQsC_c847dgk3g/s1600/r3-tablet-000.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUVOTfL4AKMC9Bpjr8i-Fq25GYXceS8EeyQFAizoQU10SudGqwyNG8TeidZd2jtBzn86DnPGkZ-P5miV3F9LJjcKvLC30L6ZtdgkXSfG7KQ3u9tDkCWpkgu4SpzcYSSQsC_c847dgk3g/s1600/r3-tablet-000.png" /></a></div>
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="text-align: left;">
</div>
Teclado e o editor com sintaxe salientada (médio mas melhor que nada)<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH0TbMZXtrlv0ulgWrPU2-576e7Mgd_hTXww7vLNWw8CXnS1GI826GGw0dWgnRSffbSJmg-GIvjFRftnIzVa0icAp3subMyUwizM9pkl-rAY_xNzWTAQjmxhJVs3xD5Qp_gnXni72cRQ/s1600/r3-tablet-003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH0TbMZXtrlv0ulgWrPU2-576e7Mgd_hTXww7vLNWw8CXnS1GI826GGw0dWgnRSffbSJmg-GIvjFRftnIzVa0icAp3subMyUwizM9pkl-rAY_xNzWTAQjmxhJVs3xD5Qp_gnXni72cRQ/s1600/r3-tablet-003.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
Acessando <b>menu > file</b> ...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6PgyMl4X8Nh33FfmvscMEa1TmLUMALky8voHFF4Hy10eAMW4jnGltbaLgY6_cMN2kOpppntcGSHWo1TPwHwly_lOrTFvBLusn9hM_dLHHVbABRDkmFitewyq4G6icWCwqp4tVlzPE3g/s1600/r3-tablet-004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6PgyMl4X8Nh33FfmvscMEa1TmLUMALky8voHFF4Hy10eAMW4jnGltbaLgY6_cMN2kOpppntcGSHWo1TPwHwly_lOrTFvBLusn9hM_dLHHVbABRDkmFitewyq4G6icWCwqp4tVlzPE3g/s1600/r3-tablet-004.png" /></a></div>
temos acesso a opção "Open by Application"<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2pQZvsOCbWI1nVUemxwmdupHR7a1KDMqSnf_W3Vufex42FSGM6aAIUnCYGGsZohrttKhLCC4DXMhhqJDD4UMZmURscbhRPRjO093AealG5mjEka4gneRCaJshW9-PuLVMEXKCdQBTTw/s1600/r3-tablet-005.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2pQZvsOCbWI1nVUemxwmdupHR7a1KDMqSnf_W3Vufex42FSGM6aAIUnCYGGsZohrttKhLCC4DXMhhqJDD4UMZmURscbhRPRjO093AealG5mjEka4gneRCaJshW9-PuLVMEXKCdQBTTw/s1600/r3-tablet-005.png" /></a></div>
<br />
<br />
... e podemos utilizar R3/Droid para que o programa sendo digitado seja enviado e executado (interpretado). É claro que optei por <b>"Sempre"</b>.Vale constar que é possível criar um atalho <b>Ctrl+R</b> > <b>Open by Application</b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOTSEW66mehL0WdgY-rwpytgq2V6u_PDMY4H4BaEFAOMIuMAXCQ0KoezPAf_fp_Jme91YeS8SEZM4rw4vDDZEd-VE48tBTwsiiR6taQgx4luCpbsTt8d-jODtKhVmcjdOPKFocHR3GcA/s1600/r3-tablet-006.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOTSEW66mehL0WdgY-rwpytgq2V6u_PDMY4H4BaEFAOMIuMAXCQ0KoezPAf_fp_Jme91YeS8SEZM4rw4vDDZEd-VE48tBTwsiiR6taQgx4luCpbsTt8d-jODtKhVmcjdOPKFocHR3GcA/s1600/r3-tablet-006.png" /></a></div>
<br />
Para a tranferências de arquivos entre o table e o desktop. Basta acessar pelo navegador no desktop para ler ou enviar arquivos do tablet.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEies67aFZ6WnRMYnSU4n6ZvKdN4IBM-Vtzu-Qt2_AfQdYFoFl6Ml_2ed1MmLRD5XWey2UT_Bythx0wO96PhW3HnRHpiGuuJ5BGSiS7qYHH5jmWaG8IjjWtEmo_0AQUUzGNDDSZcXRt9cA/s1600/r3-tablet-007.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEies67aFZ6WnRMYnSU4n6ZvKdN4IBM-Vtzu-Qt2_AfQdYFoFl6Ml_2ed1MmLRD5XWey2UT_Bythx0wO96PhW3HnRHpiGuuJ5BGSiS7qYHH5jmWaG8IjjWtEmo_0AQUUzGNDDSZcXRt9cA/s1600/r3-tablet-007.png" /></a></div>
<br />
<br />
<br />
Não é um desktop mas é um ambiente bem interessante.Guaracy Monteirohttp://www.blogger.com/profile/06389320848383273224noreply@blogger.com0tag:blogger.com,1999:blog-24046152772577150.post-15540288752778005182014-10-20T22:08:00.000-02:002014-10-22T01:21:13.252-02:00Meu primeiro programa para Linux, Windows e Android.Apesar do R3 ainda estar em desenvolvimento, resolvi testar a parte gráfica. A ideia foi fazer um programa simples para o cálculo individual do valor a ser pago em um restaurante informando-se o número de pessoas, total da conta e o percentual da gorjeta. Apesar do desenvolvimento ser feito no Linux, o programa deveria rodar no Windows e Android.<br />
<br />
O primeiro problema encontrado foi a resolução da tela final. Ficava bom no Linux e razoável no Tablet. Mas muito pequeno no celular. Alguns pequenos cálculos foram suficientes para resolver o problema de forma satisfatória.<br />
<br />
O segundo problema foi o modo como o ambiente gráfico era carregado. Estava utilizando <b>load-gui</b>. Funcionava perfeitamente mas, como a instrução pede para carregar o ambiente pela internet, achei que não seria indicado. Se o aparelho estiver desconectado, o comando irá falhar. Optei por baixar o programa <b>r3-gui.r3</b> (responsável pelo dialeto gráfico) da <a href="http://development.saphirion.com/resources/r3-gui.r3">Saphirion</a>, colocá-lo na mesma pasta do programa e utilizar <b>do %r3-gui.r3</b>. Assim não precisaria de acesso à internet. Rodou bem no Android e no Windows. No Linux estou usando o REBOL da Atronix e o programa apresentou erro. A solução mais simples foi baixar o r3-gui.r3 da <a href="https://raw.githubusercontent.com/zsx/r3-gui/master/release/r3-gui.r3">Atronix</a>. Aí precisei incluir as linhas 3 até 5 (poderia ser apenas uma linha) para contornar a situação. Não cheguei a testar se o programa da Atronix funciona com o R3 da Saphirion. <br />
<br />
O terceiro problema, que é mais uma dificuldade do que um problema propriamente dito, trata-se da execução no Android. Atualmente é necessário executar o REBOL e digitar <b>"do %caminho/programa"</b> para executar. Como estava testando o ambiente para desenvolvimento no tablet (faço outro artigo para explicar como está montado) achava mais fácil abrir o editor, abrir o programa e abrir com aplicativo (o R3 já estava listado). O ideal seria a criação de um <b>.apk</b> para a instalação e execução clicando um ícone. Já é possível criar aplicações para Android com <a href="http://www.red-lang.org/">Red</a>, mas fica para outra hora já que o ambiente ainda não está maduro o suficiente para o meu gosto. <br />
<br />
O programa ficou <i>maior</i> do que eu pensava. Foram 34 linhas, incluindo as linhas em branco e as três linha para contornar o problema. As linhas 7 e 34 foram para melhorar a aparência nos diversos foramatos de tela (desktop, tablet e celular).<br />
<br />
<br />
<br />
<br />
<pre><span style="color: black;"><span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;"> 1 </span></span>REBOL [Title: <span style="color: #7c0000;">"</span><span style="color: #7c0000;">Calculadora</span><span style="color: #7c0000;"> </span><span style="color: #7c0000;">de</span><span style="color: #7c0000;"> </span><span style="color: #7c0000;">gorjeta</span><span style="color: #7c0000;">"</span>]
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;"> 2 </span></span>
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;"> 3 </span></span><span style="color: #0033cc;">either</span> system<span style="color: #9933ff;">/</span>product <span style="color: #9933ff;">=</span> <span style="color: #9933ff;">'</span><span style="color: #770077;">atronix-view</span>
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;"> 4 </span></span> [<span style="color: #0033cc;">do</span> %r3-gui-a.r3]
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;"> 5 </span></span> [<span style="color: #0033cc;">do</span> %r3-gui.r3]
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;"> 6 </span></span>
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;"> 7 </span></span>gui-metric<span style="color: #9933ff;">/</span><span style="color: #0033cc;">set</span> <span style="color: #9933ff;">'</span><span style="color: #770077;">unit-size</span> (gui-metric <span style="color: #9933ff;">'</span><span style="color: #770077;">screen-dpi</span>) <span style="color: #9933ff;">/</span> 96
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;"> 8 </span></span>
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;"> 9 </span></span>out: <span style="color: #0033cc;">layout</span> [
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: #8080ff;">10 </span></span> <span style="color: #66ccff;"><b>hpanel</b></span> 2 [
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">11 </span></span> <span style="color: #66ccff;"><b>text</b></span> <span style="color: #7c0000;">"</span><span style="color: #7c0000;">Qtd.</span><span style="color: #7c0000;"> </span><span style="color: #7c0000;">Pessoas</span><span style="color: #7c0000;">"</span>
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">12 </span></span> f-pessoas: <span style="color: #66ccff;"><b>field</b></span> <span style="color: #7c0000;">"</span><span style="color: #7c0000;">4</span><span style="color: #7c0000;">"</span>
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">13 </span></span> <span style="color: #66ccff;"><b>text</b></span> <span style="color: #7c0000;">"</span><span style="color: #7c0000;">Total</span><span style="color: #7c0000;"> </span><span style="color: #7c0000;">Conta</span><span style="color: #7c0000;">"</span>
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">14 </span></span> f-conta: <span style="color: #66ccff;"><b>field</b></span> <span style="color: #7c0000;">"</span><span style="color: #7c0000;">50</span><span style="color: #7c0000;">"</span>
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">15 </span></span> <span style="color: #66ccff;"><b>text</b></span> <span style="color: #7c0000;">"</span><span style="color: #7c0000;">Gorjeta</span><span style="color: #7c0000;">"</span>
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">16 </span></span> f-gorjeta: <span style="color: #66ccff;"><b>field</b></span> <span style="color: #7c0000;">"</span><span style="color: #7c0000;">10</span><span style="color: #7c0000;">"</span>
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">17 </span></span> <span style="color: #0033cc;">pad</span>
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">18 </span></span> <span style="color: #66ccff;"><b>button</b></span> <span style="color: #7c0000;">"</span><span style="color: #7c0000;">Calcular</span><span style="color: #7c0000;">"</span> <span style="color: #66ccff;"><b>on-action</b></span> [
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">19 </span></span> pessoas: <span style="color: #0033cc;">to-decimal</span> <span style="color: #66ccff;"><b>get-face</b></span> f-pessoas
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: #8080ff;">20 </span></span> gorjeta: (<span style="color: #0033cc;">to-decimal</span> <span style="color: #66ccff;"><b>get-face</b></span> f-gorjeta) <span style="color: #9933ff;">/</span> 100 <span style="color: #9933ff;">+</span> 1
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">21 </span></span> conta: <span style="color: #0033cc;">to-decimal</span> <span style="color: #66ccff;"><b>get-face</b></span> f-conta
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">22 </span></span> total: round<span style="color: #9933ff;">/</span><span style="color: #0033cc;">to</span> (conta <span style="color: #9933ff;">*</span> gorjeta) 0.01
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">23 </span></span> individual: round<span style="color: #9933ff;">/</span><span style="color: #0033cc;">to</span> (total <span style="color: #9933ff;">/</span> pessoas) 0.01
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">24 </span></span> <span style="color: #66ccff;"><b>set-face</b></span> f-total total
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">25 </span></span> <span style="color: #66ccff;"><b>set-face</b></span> f-individual individual
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">26 </span></span> ]
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">27 </span></span> <span style="color: #66ccff;"><b>text</b></span> <span style="color: #7c0000;">"</span><span style="color: #7c0000;">Total</span><span style="color: #7c0000;"> </span><span style="color: #7c0000;">Geral</span><span style="color: #7c0000;">"</span>
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">28 </span></span> f-total: <span style="color: #66ccff;"><b>field</b></span>
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">29 </span></span> <span style="color: #66ccff;"><b>text</b></span> <span style="color: #7c0000;">"</span><span style="color: #7c0000;">Individual</span><span style="color: #7c0000;">"</span>
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: #8080ff;">30 </span></span> f-individual: <span style="color: #66ccff;"><b>field</b></span>
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">31 </span></span> ]
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">32 </span></span>]
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">33 </span></span>
<span style="background: #ffffff; border-right: solid 2px black; margin-right: 5px;"><span style="color: black;">34 </span></span><span style="color: #0033cc;">view</span><span style="color: #9933ff;">/</span>options out [max-hint: round<span style="color: #9933ff;">/</span>floor (gui-metric <span style="color: #9933ff;">'</span><span style="color: #770077;">work-size</span>) - gui-metric <span style="color: #9933ff;">'</span><span style="color: #770077;">title-size</span>]
</span></pre>
<br />
A aparência ficou assim:<br />
<br />
Windows XP (é o único que tenho para testar)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCIoTPaI2F5Rxl6PuiJSDEtgQRoVv2kvbx8im4tPap9yMqIhv-hCsq_V8w7-c7iBmR4p5XJpzcilfoa7PbwEkznd-XF_OMrnMyYaUA1w75bgQul8YeaBvae29va9FuExY_2zZPImaDEQ/s1600/r3-windows.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCIoTPaI2F5Rxl6PuiJSDEtgQRoVv2kvbx8im4tPap9yMqIhv-hCsq_V8w7-c7iBmR4p5XJpzcilfoa7PbwEkznd-XF_OMrnMyYaUA1w75bgQul8YeaBvae29va9FuExY_2zZPImaDEQ/s1600/r3-windows.jpg" /></a></div>
<br />
No Linux (Manjaro x64)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCnUhKk6tSN06-f869msesTlx9qAxJtl0TvD_igZTVhEqJsaV4vrE0xw33VjeIhm7I2uvH8exNCiS1QGBsB6kT6tTaNVHIOzMttJcpb2_lCzzF3ZLBIOrgTkt07HFkDdbpfMDx14S4OA/s1600/r3-linux.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCnUhKk6tSN06-f869msesTlx9qAxJtl0TvD_igZTVhEqJsaV4vrE0xw33VjeIhm7I2uvH8exNCiS1QGBsB6kT6tTaNVHIOzMttJcpb2_lCzzF3ZLBIOrgTkt07HFkDdbpfMDx14S4OA/s1600/r3-linux.jpg" /></a></div>
<br />
No Galaxy S (é velho mas o único que tenho)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEja-n7YO0beg3X0-qvn-i6JLYUi1FtQO6u2y5fGzEDPaTCxT2l8WdmDuTmeuiFuVrHY8hl72RvG5UIkDkGrhhP3RxbSzOG5Jjq2POojn50z8V2feAdpsXRVWl2zb1mY7GPUJLUKxYKG8A/s1600/r3-androidGS.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEja-n7YO0beg3X0-qvn-i6JLYUi1FtQO6u2y5fGzEDPaTCxT2l8WdmDuTmeuiFuVrHY8hl72RvG5UIkDkGrhhP3RxbSzOG5Jjq2POojn50z8V2feAdpsXRVWl2zb1mY7GPUJLUKxYKG8A/s1600/r3-androidGS.jpg" height="320" width="192" /></a></div>
<br />
No Tablet (Galaxy 10.1). A janela não ocupa toda a tela como no celular mas, como é bem maior, fica perfeitamente legível e fácil de acessar os campos/botão.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5yMyf1OpXPuQqr1U3Tnzy_ZXas1cxGpPAB8qA1126gfmoLI-06NWHWNK5ljw6Pd3-f69h5WHXRdS91sT09lqA-qoH9Jkkl6omiHTfWuDHTVRdikhxr3eh3JxylE6Ifvo1R0RlC5rFxQ/s1600/r3-tablet.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5yMyf1OpXPuQqr1U3Tnzy_ZXas1cxGpPAB8qA1126gfmoLI-06NWHWNK5ljw6Pd3-f69h5WHXRdS91sT09lqA-qoH9Jkkl6omiHTfWuDHTVRdikhxr3eh3JxylE6Ifvo1R0RlC5rFxQ/s1600/r3-tablet.jpg" height="640" width="400" /></a></div>
<br />
Conclusão? Assim até faço alguma coisa para Android, Linux e Windows. ;-)<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />Guaracy Monteirohttp://www.blogger.com/profile/06389320848383273224noreply@blogger.com2tag:blogger.com,1999:blog-24046152772577150.post-24256851938255927802014-10-19T12:31:00.001-02:002014-10-19T12:31:37.208-02:00Sujando as mãos.Para começar a brincar com REBOL, temos que baixar o ambiente. Vejamos as opções:<br />
<ul>
<li><a href="http://atronixengineering.com/downloads.html" target="_blank">Atronix REBOL 3 View Download</a> : Permite baixar versões para Linux (32 e 64 bits), Windows (32 e 64 bits) e Linux (Arm v7) que é bom para o <a href="http://www.hardkernel.com/main/main.php" target="_blank">ODROID</a>. Também existem links para baixar os fontes se alguém deseja compilar. Os programas compilados possuem a GUI (não é uma IDE, apenas um dialeto de REBOL chamado VID que permite a criação de janelas, botões, etc., ). O que utilizo foi baixado daqui.</li>
<li><a href="http://development.saphirion.com/experimental/builds/" target="_blank">Saphiri<span id="goog_1731140342"></span><span id="goog_1731140343"></span>on</a> : Com versões (32bits) para Windows, OSX, Linux e Android.</li>
<li><a href="http://rebolsource.net/" target="_blank">Rebol 3 Binaries (Unofficial)</a> : Os executáveis desta página são compilados diretamente do repositório oficial do REBOL e não possuem GUI. A quantidade de plataformas é bem interessante. Existe ara o Linux x86, OSX x86, Win32 x86, Android ARM, <a href="http://www.haiku-os.org/" target="_blank">Haiku</a> (inspirado no BeOS), Linux ARMsf, Linux ARMhf, Linux x64 e OSX PPC</li>
</ul>
<br />
Depois de baixar, não é necessário instalar. O REBOL pode ser executado de qualquer lugar. É claro que colocando no path e ajustando algumas variáveis facilita a vida.<br />
<br />
Para testes não é necessário um editor já que os comandos podem ser digitados diretamente no console e o resultado é mostrado imediatamente. Como o R3 não permite que o comando seja quebrado em diversas linhas, para fazer algum laço ou coisas mais complexas, utilize o editor de sua preferência. Muitos permitem salientar a sintaxe e outras facilidades.<br />
<br />
<h4>
Considerações iniciais.</h4>
<br />
- Para sair do ambiente, digite <span style="color: red;"><b>quit</b></span> e não <b>exit</b>.<br />
<br />
- O delimitador é espaço portanto, <b><span style="color: red;">2 + 2</span></b> retorna <b>4</b> mas <b><span style="color: red;">2+2</span></b> retorna um erro. <br />
<br />
- Todo o arquivo que contenha um programa deverá possuir um cabeçalho no início. Podemos, por exemplo, definir uma versão e outros programas poderão acessar posteriormente para diversas finalidades. Por hora podemos ter uma cabeçalho simples como: <code>REBOL [<span style="color: #d55e00;">Title</span>: <span style="color: #848ea9;">"Título do script"</span>]</code>
<br />
<br />
- Para obtermos informações sobre funções, um bom local é o <a href="http://www.rebol.com/docs/reference.html" target="_blank">REBOL Quick Reference Card</a>. Se estivermos no ambiente interativo do console, podemos obter informações sobre qualquer função digitando <span style="color: red;"><b>help <função></b></span> (o <span style="color: red;"><b>help</b></span> pode ser substituído por <span style="color: red;"><b>?</b></span> ).Se digitamos <span style="color: red;"><b>>> help loop</b></span> (o <b>>></b> é o prompt e não é digitado) obtemos:<br />
<pre><span style="color: #d55e00;">
<b>USAGE:
LOOP count block
DESCRIPTION:
Evaluates a block a specified number of times.
LOOP is a native value.
ARGUMENTS:
count -- Number of repetitions (number!)
block -- Block to evaluate (block!)
</b></span></pre>
<br />
Então, o uso de <b>LOOP</b> requer dois parâmetros. Um <b>count</b> que é o número de repetições e um <b>block</b> que é um bloco (já veremos) que será executado em cada repetição.<br />
<br />
<br />
- Blocos são delimitados por colchetes <span style="color: red;"><b>[</b></span> e <span style="color: red;"><b>]</b></span> e podem conter dados e/ou código e/ou outros blocos. Uma linha do tipo <b><code>loop 5 [<span style="color: #56b4e9;">print</span> 3]</code></b> irá imprimir o número três cinco vezes.<br />
<br />
- Apesar de variável ser um termo que não corresponde a realidade em REBOL, podemos definir uma variável escrevendo seu nome seguido de dois pontos e sem espaço. Por exemplo, <b><code><span style="color: #d55e00;">lista</span>: [1 2 3 4 5]</code></b> poderia significar que atribuímos uma array unidemensional a uma variável lista. Mas está mais para dizer que a palavra lista está associaida a um bloco contendo dados numéricos de 1 a 5. <br />
<br />
Ficamos por aqui hoje. Depois tem mais. Um pequeno código (poderia ser escrito em uma linha) para ler uma determinada página e extrair todos os links: <br />
<br />
<br />
<pre><span style="color: black;"><span style="background: #eeeeee; border-right: solid 2px black; margin-right: 5px;"><span style="color: #9999ff;">1 </span></span><span style="color: #6699ff;"><b>parse</b></span> to-string <span style="color: #990099;"><b>read</b></span> http:<span style="color: black;">/</span><span style="color: black;">/</span>www.rebol.com [
<span style="background: #eeeeee; border-right: solid 2px black; margin-right: 5px;"><span style="color: #9999ff;">2 </span></span> <span style="color: #6699ff;"><b>any</b></span> [thru <span style="color: #0033cc;">"</span><span style="color: #0033cc;">A</span><span style="color: #0033cc;"> </span><span style="color: #0033cc;">HREF=</span><span style="color: #0033cc;">"</span> <span style="color: #990099;"><b>copy</b></span> link <span style="color: #990099;"><b>to</b></span> <span style="color: #0033cc;">"</span><span style="color: #0033cc;">></span><span style="color: #0033cc;">"</span> (<span style="color: #6699ff;"><b>print</b></span> link)] <span style="color: #990099;"><b>to</b></span> end]
<span style="background: #eeeeee; border-right: solid 2px black; margin-right: 5px;"><span style="color: #9999ff;">3 </span></span>
</span></pre>
<br />
Sim, não é preciso baixar ou instalar nada no ambiente para executar a tarefa. Tudo foi feito pelo <b>parse</b> e <b>read</b>. A função <b>read</b> pode ler dados de um arquivo, porta ou url. Se o arquivo for um diretório, retorna uma lista com todos os arquivos e sub-diretórios existentes. Como REBOL não trabalha com <a href="http://pt.wikipedia.org/wiki/Express%C3%A3o_regular">ER</a>, parse é a resposta em REBOL para expressões regulares. Com tal, sua explicação seria suficiente para um <a href="http://aurelio.net/regex/guia/">livro</a>.<br />
<br />
Informações sobre <b>read</b>: <br />
<br />
<pre><span style="color: #d55e00;"><b>USAGE:
READ source /part length /seek index /string /lines
DESCRIPTION:
Read from a file, URL, or other port.
READ is an action value.
ARGUMENTS:
source (port! file! url! block!)
REFINEMENTS:
/part -- Partial read a given number of units (source relative)
length (number!)
/seek -- Read from a specific position (source relative)
index (number!)
/string -- Convert UTF and line terminators to standard text string
/lines -- Convert to block of strings (implies /string)</b>
</span></pre>
<br />
Informações sobre <b>parse</b> (para maiores detalhes sobre <b>rules</b>, melhor acessar a página do <a href="http://rebol.com/r3/docs/functions/parse.html">parse</a>). Pessoalmente acha mais legível (alguns acham mais poderoso mas não vou entrar no mérito) que trabalhar com ER, apesar da maior verbosidade. <br />
<pre><span style="color: #d55e00;">
<b>USAGE:
PARSE input rules /all /case
DESCRIPTION:
Parses a string or block series according to grammar rules.
PARSE is a native value.
ARGUMENTS:
input -- Input series to parse (series!)
rules -- Rules to parse by (none = ",;") (block! string! char! none!)
REFINEMENTS:
/all -- For simple rules (not blocks) parse all chars including whitespace
/case -- Uses case-sensitive comparison</b>
</span></pre>
<br />
<br />Guaracy Monteirohttp://www.blogger.com/profile/06389320848383273224noreply@blogger.com0República Federativa do Brasil-14.235004 -51.925279999999987-67.751949 -134.5424675 39.281941 30.691907500000013tag:blogger.com,1999:blog-24046152772577150.post-86527572582352240782014-10-17T17:28:00.001-03:002014-10-28T18:15:43.725-02:00InícioResolvi aprender um pouco mais sobre <a href="http://rebol.com/" target="_blank">REBOL</a> e decidi deixar registrado pois poderá servir como referência para o futuro. Para mim ou qualquer outro que desejar. <br />
<br />
<i>- Mas é de comer? É parente do COBOL? SNOBOL?</i><br />
<br />
Não! É uma linguagem de programação (<b>REBOL = Relative Expression Based Object Language</b>) multiplataforma, multiparadigma desenvolvida por <a href="http://en.wikipedia.org/wiki/Carl_Sassenrath" target="_blank">Carl Sassenrath</a>.É interpretada, concisa, de fácil aprendizado e muito boa para a criação de <a href="http://pt.wikipedia.org/wiki/Linguagem_de_dom%C3%ADnio_espec%C3%ADfico" target="_blank">DSLs</a>.<br />
<br />
<i>- Mas eu não conheço. Ninguém deve utilizar.</i><br />
<br />
Tem muita coisa que pessoas utilizam e eu também não conheço. Mas vamos contar um pouco da história para facilitar. Inicialmente, era uma linguagem comercial, isto é, para usar seria necessário pagar. Pelo menos uma parte dela que era mais indicada para o desenvolvimento de aplicativos comerciais. Surgiram algumas variantes de código aberto como Boron, Topaz e <a href="http://www.red-lang.org/" target="_blank">Red</a>. Como aspectos interessantes de Red, temos o fato de que ela poderá ser compilada ou interpretada em diversas plataformas. E está sendo desenvolvida utilizando REBOL, isto é, o REBOL compila um código em REBOL para diversas plataformas. No mínimo, interessante.<br />
<br />
Com o desenvolvimento de REBOL 3 (terceira versão), o Carl resolveu abrir o código da linguagem. Mas as coisas andam muito lentamente por lá e o acesso é meio restrito. Com isto, algumas empresas que já utilizavam REBOL, resolveram trabalhar na nova versão (R3) e já lançaram suas versões baseadas no código aberto com diversas atualizações. Uma das empresas é a <a href="http://development.saphirion.com/rebol/" target="_blank">Shaphirion</a> e a outra a <a href="http://atronixengineering.com/downloads.html" target="_blank">Atronix</a>. No vídeo abaixo é possível ver melhor o trabalho da Atronix e a utilização de REBOL.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/jIw7aRP6JPU?feature=player_embedded' frameborder='0'></iframe></div>
<br />
<br />
No decorrer dos artigos, pretendo colocar alguns exemplos em Python, Ruby, etc. ao lado de REBOL. Não é para dizer: "VIram como REBOL é melhor!". Apenas para uma comparação mais visual. onde o leitor poderá ter uma noção de como se faz algo em uma ou outra linguagem. Todas as linguagens possuem seus pontos fortes e fracos. Como pontos fortes do REBOL posso citar:<br />
<ul>
<li>facilidade de aprendizado;</li>
<li>não é necessário ser administrador/root para instalar e usar;</li>
<li>com aproximadamente 0,7M você tem uma linguagem muito poderosa;</li>
<li>você poderá executar seus programas no Windows, Linux, Mac, Android e onde mais a linguagem estiver disponivel;</li>
<li>vem com pilhas e carregador incluídos. ;-)</li>
</ul>
<br />
Ok, mas não podemos encerrar sem deixar um pequeno exemplo. Não aquele "hello world" sem graça. <br />
<br />
<br />
<br />
<pre>print <span style="color: #4e9a06;">"Bem vindo!"</span>
<span style="color: #00578e;"><b>sorteado</b></span>: <span style="color: brown;"><b>to-string</b></span> <span style="color: #2f8b58;"><b>random</b></span> 100
<span style="color: brown;"><b>until</b></span> [
<span style="color: #00578e;"><b>chute</b></span>: <span style="color: brown;"><b>ask</b></span> <span style="color: #4e9a06;">"Chute: "</span>
case [
chute > sorteado [<span style="color: brown;"><b>print</b></span> <span style="color: #4e9a06;">"Alto"</span> false]
chute < sorteado [<span style="color: brown;"><b>print</b></span> <span style="color: #4e9a06;">"Baixo"</span> false]
true [<span style="color: brown;"><b>print</b></span> <span style="color: #4e9a06;">"Você venceu!"</span>]]]
<span style="color: brown;"><b>print</b></span> [<span style="color: #4e9a06;">"Fim de jogo!"</span>]</pre>
<br />
O que o programa faz é selecionar um número qualquer entre 1 e 100 e esperar que o usuário digite o número correto. Se o número informado for maior que o sorteado, o programa informa <b>Alto</b>. Se o número for menor será informado <b>Baixo</b>. O programa é semelhante em muitas linguagens mas, como características do REBOL, temos a ausência de delimitadores. O espaço é o delimitador. O único delimitador são os colchetes <span style="color: red;"><b>[</b></span> e <span style="color: red;"><b>]</b></span> que são utilizados para delimitar um bloco (pode ser dados ou código). Uma lista teria o seguinte formato:<br />
<br />
<pre><span style="color: #00578e;"><b>lista</b></span>: [1 2 3 4 5]
</pre>
<br />
Como observação final, eu fechei os três colchetes em uma única linha. É o modo como se fecha em lisp (não em REBOL geralmente). Mas eu gosto mais por ficar com uma aparência de Python (que eu não programo).<br />
<br />
<br />
E assim termina o primeiro dia.<br />
<br />Guaracy Monteirohttp://www.blogger.com/profile/06389320848383273224noreply@blogger.com0