Reaktivní programování
Reaktivní programování je pěkně popsané v oficiální dokumentaci.
Reaktivní programování vytváří interní mechanizmus, který automaticky aktualizuje stav objektu A při změně objektu B - bez volání funkcí či subrutin.
Red používá objektově orientovaný reaktivní model push.
Reaktor je reaktivní objekt, jehož změna spustí změny v jiných objektech. Vytváří se příkazem make reactor!.
Reaktivní vztah (statický nebo dynamický) je deklarace vztahu mezi příslušnými poli reaktivně propojených objektů. Vytváří se funkcemi is nebo react .
Příkaz make reactor! a funkce is
Velmi bazální příklad použití reaktivního programování:
Red[]
a: make reactor! [x: ""] ;reaktor
b: is [a/x] ;reaktivní vztah
forever [
a/x: ask "? " ;here we input a value for x field of 'a'
print b ;here we print b and... surprise! it changed!
] ; Pozor, vytváří nekonečnou smyčku!
?house
house
?fly
fly
?bee
bee
Reaktor může aktualizovat sám sebe:
Red[]
a: make reactor! [x: 1 y: 2 total: is [x + y]]
forever [
a/x: to integer! ask "?"
print a/total
] ; Pozor, vytváří nekonečnou smyčku!
?33
35
?45
47
deep-reactor!
Stejně jako má copy upřesnění /deep pro přístup k zanořeným hodnotám (bloky uvnitř bloku), totéž má i reactor!.
Tento program má opakovat vstup z konzoly ale jaksi nechodí:
Red[]
a: make reactor! [z: [x: ""]]
b: object [w: is [a/z/x]]
b/w: "no change"
forever [
a/z/x: ask "?"
print b/w
]
?house
no change
?blue
no change
Pokud však použijeme deep-reactor!:
Red[]
a: make deep-reactor! [z: [x: ""]]
b: object [w: is [a/z/x]]
b/w: "no change"
forever [
a/z/x: ask "?"
print b/w
]
?house
house
?blue
blue
function! react
Toto je příkaz pro vytváření reaktivních grafických aplikací GUIs. Nahlédněte prosím do GUI-Pokročilá témata.
function! clear-reactions
Odstraní bezpodmínečně všechny definované reakce.
function! react?
Zjistí, zda je pole objektu reaktivním zdrojem . Pokud ano, vrátí se první reakce, nalezená jako zdroj v poli objektu; pokud ne, vrací se hodnota note. Upřesnění /target kontroluje, zda je pole cílem místo zdrojem a vrátí první reakci, zacílenou na toto pole nebo vrátí none při absenci shody.
/target => kontroluje, jde-li o cíl (target) a ne zdroj (source).
function! dump-reactions
Vytvoří seznam registrovaných reakcí pro ladící účely.