sábado, 25 de outubro de 2014

Tipos 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: "nome" + 1 retorna um erro

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).

A linguagem possui 58 tipos nativos.

>> ? system/catalog/datatypes

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!]


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:

logic!

Armazenam valores lógicos e são utilizados em testes condicionais. Os possíveis valores para verdadeiro são true, yes e on e para falso são false, no e off. Permitem uma maior legibilidade ao código.

integer!

Armazenam números inteiros. É importante salientar que a divisão converte o número para decima. Por exemplo, 4 / 2 retorna 0.5. Caso seja necessário um resultado inteiro, devemos efetuar a conversão de tipos: to integer! 2 / 4 retorna 0.

decimal!

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 (') para separar as sequências, facilitado a leitura. Então 1'246'487,31 é um número válido. A letra E representa o expoente como em 1,23e10 ou 3,14e-208.

percent!

Utilizado para representar percentual. 7% + 2% = 9%. Convertendo para decimal to-decimal 5% = 0.05. Também está relacionado com legibilidade,

money!

Especifica valores financeiros e devem iniciar com o cifrão ($). No R3 serve apenas para ficar mais bonitinho (pelo menos por enquanto). Nas versões anteriores do Rebol, era possível especificar R$12.23 e US$5.26. O programa não permitia somar os dois valores sem uma conversão.

char!

Informa um único caractere (letra, número ou símbolo). Deve ser seguida pelo símbolo sustenido (#) e o caractere entre aspas. Então #"a" indica o caractere a minúsculo. Existem diversas formas de criar caracteres especiais que não podem ser entrados diretamente pelo teclado. O caractere Esc, por exemplo, pode ser informado como #"^(esc)" ou to-char 27. É possível entrar qualquer caractere informando o seu valor hexadecimal (0000 até FFFF) entre parênteses. #"^(001B)" ou #"^(1B)". É possível algumas operações entre caracteres como somar ou subtrair um número ou outro caractere. Por exempĺo: #"A" + 1 = #"B".

pair!

São pares ordenados (x,y) e também aceitam diversas operações e o acesso de seus valores individuais.  Exemplificando a soma temos: 2x3 + 1 = 3x4 e 2x3 + 3x1 = 5x4. Para acessar individualmente podemos usar first e second para retornar o valor de x e y.

tuple!

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 1.2.120 > 1.2.2 = true ou 1.2.120 > 1.2.200 = false. Podemos calcular 20% de uma cor fazendo 255.128.128 * 20% = 127.64.64.

time!

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: 10:30 + 2:42 = 13:12 ; 2:40 * 2 = 5:20 ; 0:120:70 - 0:1:2 = 2:00:08.

date!

Representam datas e também permitem operações. Aceita uma variedade de formatos. 3/11/2014 + 80 = 22-Jan-2015 (somamos 80 dias em uma data) ; 1/1/2001 - 1/1/2000 = 366 (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.

binary!

Armazenam dados binários que podem estar na base binária, hexa (default) ou 64. Como exemplos podemos ter: #{45FA100125FA4E7C} (base 16 e é necessário a representação de um byte com os dois dígitos 00-FF), 2#{00001111 11001100 00110011} (base 2 sendo cada byte representado por 8 dígitos) e 64#{A465Eesq} (base 64).

string!

Representam uma série de caracteres. Se estiver em uma linha, pode ser delimitada por aspas (") ou deve ser delimitada por parênteses {} 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: "Nome da pessoa", {Nome da pessoa} , {Nome {da} pessoa} e {Nome da^} pessoa} são exemplos válidos.

file!

Contém o nome e ou caminho de um diretório ou arquivo. É precedido pelo símbolo de percentual (%). Por exemplo: %./rebol/teste.r3 informa o arquivo teste.r3 que se encontra no subdiretório rebol ao passo que %teste.r3 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 (/ no linux e \ no windows). Também permite ler o conteúdo de um arquivo apenas digitando-se read %/caminho/arquivo (sem a necessidade de comandos para abrir ou fechar o arquivo).

email!

Identifica um endereço válido de email. Ainda não está funcionando no R3.

url!

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 read http://www.rebol.com.

tag!

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 (<) e maior (>).

image!

Indica que é uma imagem.Se uma variável possui uma imagem (por exemplo: 
image: load http://kde-look.org/CONTENT/content-files/167376-kdeflames.png) com imagem/size retorna um par informando o número de pixel na verticar e horizontal (e.g. 512x158), pick posição returna uma tupla com informações (RGBA) do pixel e poke posição 255.0.0.0 irá setar o pixel como vermelho.

block!

É um grupo de qualquer coisa delimitado por colchetes [ e ]. Por exemplo, [10 + 20] é um bloco contendo dois inteiros e uma word e pode até ser avaliado retornando 30. Já um bloco [1 2 3 4 5 6] é um bloco contendo seis inteiros. É como um array (mais poderoso) em outras linguagens.

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, type? first [nome:] retorna set-word!. Por enquanto, basta saber que nome: 10, irá colocar na palavra nome o valor inteiro 10.

Nenhum comentário:

Postar um comentário