Datové typy


Každá hodnota Redu má svůj specifický datový typ, který určuje rozsah přípustných hodnot, přípustné operace a způsob uložení hodnot v paměti. Datových typů je aktuálně 46, včetně datového typu datatype! Výpis datových typů získáme dotazem:

>> ? datatype!

Z těchto 46 datových typů je vytvořeno 16 skupin (typesetů), majících společné vlastnosti. Některé datové typy se vyskytují ve více skupinách. Výpis těchto skupin získáme dotazem:

>> ? typeset!

Jsou to tyto tyto skupiny: any-(type!, object!, string!, word!, function!, block!, path!, list!), series!, number!, scalar!, immediate!, internal!, external!, default!, all-word!.

Jednotlivé datové typy:

word!

Základní datový typ. Slova jsou klíčovým pojmem v jazyce Red. Vyskytují se ve čtveré typové formě:

word  - typ word!,        základní formát pro přirozenou hodnotu slova

word: - typ set-word!, formát pro přiřazení hodnoty ke slovu

:word - typ get-word!, odkaz na hodnotu slova (bez vyhodnocení)

'word - typ lit-word!, odkaz na slovo jako symbol

block!

Bloky jsou skupiny hodnot a slov. Používají se všude, od samotného skriptu až po bloky dat a bloky kódu ve skriptu.


>> bl: [123 data "zdar"]        ; blok s daty
== [123 data "zdar"]

>> []                           ; prázdný blok
== []

paren!

Datový typ paren! je kolektor, ohraničený kulatými závorkami. Používá se hlavně k vyjádření preference aritmetických operací.

Objekt typu paren! se vytvoří příkazem make paren! :

>> prn: make paren! ["a" 5]
== ("a" 5)


none!

Ekvivalent "nuly" v jiných programovacích jazycích. Indikuje neexistující data.

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

logic!

Kromě klasických true a false, používá Red také on , offyes a no jako hodnoty datového typu  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!

Řada (series) znaků uvnitř uvozovek nebo složených závorek. Zabírá-li řetězec více než jeden řádek, je použití {} jedině možné.

Manipulace s řetězci se provádí s použitím příkazů, popsaných v kapitolách o řadách.

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

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

>> a: {my
{    string}           ; první "{" je signál konzoly!
== "my^/string"
>> print a
my
string

>> a: "my new                ;trying to span over more than one line
*** Syntax Error: invalid value at {"my new}

char!

Uvedena znakem #  a uvnitř uvozovek, představuje hodnota typu char! kódový bod Unicodu. Jsou to celá čísla v rozsahu  hexadecimal 00 po hexadecimal 10FFFF (0 až 1,114,111).

#"A" je char!

"A" je string!

Umožňuje určité matematické operace.

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

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

integer!

32 bitová celá signovaná čísla. Od  −2,147,483,648 po 2,147,483,647. Je-li číslo mimo tento rozsah, přiřadí mu Red datový typ  float!.

Poznámka: Dělení  2 celých čísel dává oseknutý výsledek:

>> 7 / 2
== 3

float!

64 bitová desetinná čísla. Prezentují se s desetinnou tečkou či čárkou nebo e-notací.

>> 7.0 / 2
== 3.5

>> 3e2
== 300.0

>> 6.0 / 7
== 0.8571428571428571

file!

Název je uveden znakem %. Nepoužíváte-li aktuální cestu, máte uvést cestu v uvozovkách. Cesta používá lomítka  (/); zpětná lomítka (\) jsou ve Windows automaticky konvertována na obyčejná lomítka.

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

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

path!

Používá se k přístupu k interním položkám větších struktur pomocí lomítka (/). Používá se v různých situacích, například:

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

Lomítka "/" se také používají při přístupu k objektům a k upřesněním.

time!

Čas je vyjádřen ve formátu  hours:minutes:seconds.subseconds. Všimněte si, že sekundy a subsekundy jsou odděleny tečkou, nikoliv dvojtečkou. Ke každé části je možný přístup přes upřesnění (refinement). Nahlédněte do kapitoly  Práce s časem.

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

>> a: now/time/precise          
== 22:05:46.805                
>> type? a
== time!                ; datový typ objektu a je time!
>> a/hour
== 22
>> a/minute
== 5
>> a/second
== 46.805                          ; datový typ a/second je float!

date!

Red akceptuje datumy v různých formátech:

>> 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   ; zkuste si totéž pro první a druhé tisíciletí        
31-Oct-2017

Red rovněž ověřuje platnost datumů, včetně s uvážením přechodných let. Na den, měsíc či rok se lze odkázat upřesněním:

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

point! a pair!

Point! a pair! se zdají být úplně stejné. Uvádějí celočíselné souřadnice v kartézském souřadnicovém systému (x y axys).                           K typu point! nejsou informace

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

percent!

Prezentují se přidáním znaku "%" za číslem.

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

tuple!

Tuple (entice) je výpis tří až dvanácti celých čísel o velikosti 0 až 255, oddělených  tečkami. Entice jsou užitečné pro prezentaci čísel verzí, IP adres a barev (např.: 0.255.0).

S enticí lze provádět tyto operace:  random, add, divide, multiply, remainder, subtract, and, or, xor, length?, pick (nikoliv 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

Úplný přehled barev ve vyjádření typu word! a tuple! získáme zadáním následujícího dotazu:

>> ? tuple!
red            255.0.0       ; následuje výpis 45 barev