Objekty
Objekt je kontejnér, který sdružuje data či funkce a je (téměř vždy) přiřazený ke slovu (proměnné). Pro přístup k atributu objektu používáme lomítko (neboli formát podobný cestě). Tímto se Red liší od většiny jazyků, které v podobných situacích používají tečku.
Vytvoření objektu:
action! make object! , function! context a function! object
K vytvoření objektu použijeme příkaz make object! nebo jeho kratší varianty object případně context.
Red []
myobject: object [
x: 10
y: 20
f: function [a b] [a + b]
name: none
tel: none ]
myobject/name: "Dimitri"
myobject/tel: #3333-3333
print myobject/x
print myobject/y
print myobject/f 3 5
print myobject/name
print myobject/tel
10
20
8
Dimitri
3333-3333
Vyhodnocení výrazu se provede pouze při deklaraci objektu (constructor code). Zde například příkaz 'print' je posléze nepřístupný.:
>> myobject: object [print "hello" a: 1 b: 2]
hello
== make object! [
a: 1
b: 2
]
>> myobject/a
== 1
Reference 'self':
Má-li objekt odkazovat sám na sebe, použijeme specielní klíčové slovo self :
Red []
myobject: object [
x: 10
y: 20
f: function [a b] [a + b]
autoanalisys: does [print self]
]
myobject/autoanalisys
x: 10
y: 20
f: func [a b][a + b]
autoanalisys: func [][print self]
Klonování objektu a dědění:
Pouhé přiřazení objektu k jinému jménu vytváří pouhou kopii ukazovátka (pointer) na tento objekt. Změní-li se originál, změní se i jeho prezentace v jiném objektu:
>> a: object [x: 10] ; odezva konzoly zde není uvedena
>> b: a ; odezva konzoly zde není uvedena
>> a/x: 20
== 20
>> b/x
== 20 ; rovněž změněno! b je závislá kopie
K vytvoření nezávislé kopie objektu použijeme slovo copy:
>> a: object [x: 10] ; odezva konzoly zde neuvedena
>> b: copy a ; odezva konzoly zde neuvedena
>> a/x: 20
== 20
>> b/x
== 10 ; žádná změna! b je nezávislá kopie
Chceme-li vytvořit nový objekt, který dědí z jiného objektu, použijeme sekvenci: make zdroj [nová specifikace]:
Red []
a: object [x: 3] ; deklarace zdrojového objektu
b: make a [y: 12] ; nový objekt
print b
x: 3
y: 12
find a select - pro objekty
find zkontroluje, zda zadané pole existuje a vrací true nebo none
select provádí totéž ale pokud zadané pole existuje, vrací jeho hodnotu
Red []
obj: object [a: 44]
print find obj 'a
print select obj 'a
print find obj 'x
print select obj 'something
true
44
none
none
Přípustný formát zadávaného pole je lit-word! ('word). Hodnotu proměnné lze evokovat příkazem obj/a.