Datatypes - tipos de dados


Pode ser uma boa idéia você dar uma olhada antes no capítulo sobre séries, uma vez que alguns exemplos usam palavras pré-definidas que estão listadas lá.

Datatypes básicos:

 none!

O equivalente a "null" em outras linguagens de programação. Um dado não-existente.

>> a: [1 2 3 4 5]
== [1 2 3 4 5]
>> pick a 7
== none

 logic!

Além dos clássicos  true e false, Red reconhece também  on , offyes e no como tipos de dado logic! .

>> a: 2 b: 3
== 3
>> a > b
== false

>> a: on
== true
>> a
== true

>> a: off
== false
>> a
== false

>> a: yes
== true
>> a
== true

>> a: no
== false
>> a
== false

 string!

Uma série de caracteres dentro de aspas ou colchetes {}. Se uma string se estende por mais de uma linha, os colchetes são obrigatórios.

Strings são séries, e podem ser manipulados usando os comandos descritos no capítulo sobre séries.

>> a: "my string"
== "my string"

>> a: {my string}
== "my string"

>> a: {my
{ string}        ;o primeiro "{" não é um erro, é como o console mostra. Tente!
== "my^/string"
>> print a
my
string

>> a: "my new                          ;tentando usar aspas para fazer uma string com mais de uma linha.
*** Syntax Error: invalid value at {"my new}

 char!

Precedidos por # e dentro de aspas, valors  char! representam um ponto de Unicode. São integers (inteiros) que se estendem de hexadecimal 00 a hexadecimal 10FFFF. (0 a 1,114,111 em decimal.)

#"A" é um char!

"A" é um string!

Podem se submeter a operações matemáticas:.

>> a: "my string"
== "my string"
>> pick a 2
== #"y"
>> poke a 3 #"X"
== #"X"
>> a
== "myXstring"

>> a: #"b"
== #"b"
>> a: a + 1
== #"c"

 integer!

signed numbers de 32 bits. vão de −2,147,483,648 a 2,147,483,647. Se um número cai fora destes limites, o Red designa um float! datatype.

Nota: Dividir dois inteiros (integer!) dá um resultado truncado:

>> 7 / 2
== 3

 float!

Números floating point de 64 bits. Representados por números com um ponto ou usando a notação exponencial.

>> 7.0 / 2
== 3.5

>> 3e2
== 300.0

>> 6.0 / 7
== 0.8571428571428571

 file!

Tipo que representa arquivos é é precedido por %. Se você não está usando o path corrente, você tem que adicionar o path usando aspas. Barras e barras invertidas ("/" "\" ) são convertidos automaticamente pelo Red conforme o sistema operacional.

>> write %myfirstfile.txt "This is my first file"

>> write %"C:\Users\André\Documents\RED\mysecondfile.txt" "This is my second file"

 path!

Usado para acessar dados dentro de estruturas usando "/". Pode ser usado em diferentes situações, por exemplo:

>> a: [23 45 89]
== [23 45 89]
>> print a/2
45

Barras "/" também são usadas para acessar objetos e refinamentos. Eu desconheço o funcionamento interno do Red, mas me parece que se trata de casos do datatype path! .


 time!

Tempo expresso em horas:minutos:segundos.subsegundos. Note que segundos e subsegundos são separados por um ponto e não por dois pontos. Você pode acessar cada um deles usando refinamentos. Veja o capítulo sobre Tempo e temporização.

>> mymoment: 8:59:33.4
== 8:59:33.4
>> mymoment/minute: mymoment/minute + 1
== 60
>> mymoment == 9:00:33.4

>> a: now/time/precise        ; o datatype de "a" é time!
== 22:05:46.805                
>> type? a
== time!
>> a/hour
== 22
>> a/minute
== 5
>> a/second
== 46.805                        ;second é um float!

 date!

O Red aceita datas em uma grande variedade de formatos:

>> print 31-10-2017
31-Oct-2017
>> print 31/10/2017
31-Oct-2017
>> print 2017-10-31
31-Oct-2017
>> print 31/Oct/2017
31-Oct-2017
>> print 31-october-2017
31-Oct-2017
>> print 31/oct/2017
31-Oct-2017
>> print 31/oct/17                ;só funciona se o ano é o último campo, mas cuidado: 1917 or 2017?.
31-Oct-2017

O Red também checa se as datas são válidas, e até leva em consideração anos bisextos.
Você pode acessar dia, mês e ano usando refinamentos:

>> a: 31-oct-2017
== 31-Oct-2017
>> print a/day
31
>> print a/month
10
>> print a/year
2017

 point! e pair!

Point! e pair! me parecem ser a mesma coisa. Provavelmente pair! existe para manter a compatibilidade com Rebol.
Representam pontos em um sistema cartesiano de coordenadas (eixos "x" e "y"). São compostos de dois inteiros separados por "x", por exemplo 23x45.

>> a: 12x23
== 12x23
>> a: 2 * a
== 24x46
>> print a/x
24
>> print a/y
46

 percent!

Representado adicionando "%" após o número.

>> a: 100 * 11.2%
== 11.2
>> a: 1000 * 11.3%
== 113.0

 tuple!

Um  tuple! é uma lista de 3 até 12 bytes (inteiros de 0 a 255) separados por pontos. Note que 2 números separados por ponto fazem um float! não um tuple!
Tuples são úteis para representar coisas como número de versões, número de IP e cores (exemplo: 0.225.0)
Um tuple! não é uma série, assim, a maior parte das operações de séries dão um erro se aplicadas a tuples!. Algumas operações que podem ser aplicadas a tuples! são: random, add, divide, multiply, remainder, subtract, and, or, xor, length?, pick (não poke), reverse.

>> a: 1.2.3.4
== 1.2.3.4
>> a: 2 * a
== 2.4.6.8
>> print pick a 3
6
>> a/3: random 255
== 41
>> a
== 2.4.41.8

Classes de Datatypes   number! e scalar!

Alguns datatypes são classes de datatypes.

 integer!float!percent!  pertencem ao datatype number!.

E qualquer um dos datatypes seguintes é também um  scalar! datatype: char!integer!float!pair!percent!tuple!time!date!