Uvozi vedenje, ga veži na svoje podatke in spremeni, kar sme mesto klica spremeniti. Avtomat stanj ostane last vedenja.
Večina programa Orb je sestavljena, ne napisana. Vedenje iz standardne knjižnice (ali tvojih gradnikov) se uvozi z uses, nato se nanj skliče po lastnostih ali kot na celoten orbital. Vežeš ga na svojo entiteto in nastaviš gumbe; njegova stanja in prehodi ostanejo natanko taki, kot jih določa vedenje.
1uses Browse from "std/behaviors/std-browse"
2
3trait BookShelf = Browse.traits.BrowseItemBrowse -> Book {
4 config {
5 browseLook: feed
6 fields: [{ name: "name", label: "Title", variant: h4 }]
7 }
8}Alias.traits.Name -> Entity vzame lastnost in jo veže na tvojo entiteto. Telo se sme dotakniti le površine klica:
| Prilagoditev | Učinek |
|---|---|
config { key: value } | Nastavi gumbe, ki jih lastnost navede |
events { OLD: NEW } | Preimenuje ključe dogodkov povsod v avtomatu |
fields { old: new } | Preimenuje polja entitete, ki jih lastnost bere in piše |
listens { … } | V celoti zamenja poslušanja lastnosti |
emitsScope internal | Vsa oddajanja ohrani znotraj orbitala |
Na mestu klica ni mogoče dodati stanja, odstraniti prehoda ali spremeniti učinkov prehoda. Za drugačen odziv dodaj sorodno lastnost, ki posluša dogodke vedenja. To pravilo naredi sestavljen program enako preverljiv kot ročno napisanega.
Tu sta dve standardni vedenji vezani na lokalno entiteto Book, brez ročno napisanega avtomata stanj:
LibraryPage
on LibraryView · states: 1 · transitions: 0BookShelf
on Book · states: 3 · transitions: 9BookFacts
on LibraryView · states: 1 · transitions: 0MasterListView
on Book · states: 1 · transitions: 1books
on loan
Abelson and Sussman
Hoare
Knuth
Zgornji program kot avtomati stanj, eden za vsako lastnost: vsak okvir je stanje, vsaka puščica dogodek, ki ga premakne, ikone na puščici pa so učinki, ki jih ta dogodek izvede. ◇ na puščici je varovalo; z miško pojdite nanj in preberite pogoj. Kako brati AVL
1app std-orb-docex-library "1.0.0"
2"std-orb-docex-library — composition: two standard behaviors bound to a local entity and configured at the call site, with no state machine written by hand."
3orbital LibraryOrbital {
4 uses Browse from "std/behaviors/std-browse"
5 uses StatBand from "std/behaviors/std-stat-band"
6
7 entity Book [persistent: docex_books, local] {
8 id : string!
9 name : string!
10 author : string = ""
11 status : "active" | "pending" | "inactive" = active
12 instances [
13 { id: "B-1", name: "Structure and Interpretation", author: "Abelson and Sussman", status: active },
14 { id: "B-2", name: "Communicating Sequential Processes", author: "Hoare", status: pending },
15 { id: "B-3", name: "The Art of Computer Programming", author: "Knuth", status: active }
16 ]
17 }
18
19 entity LibraryView [runtime] {
20 id : string!
21 }
22
23 trait LibraryPage -> LibraryView [interaction, instance] {
24 initial: idle
25
26 state idle {
27 INIT -> idle
28 (render-ui main { type: stack, direction: vertical, gap: lg, children: [@trait.BookFacts, @trait.BookShelf] })
29 }
30 }
31
32 trait BookShelf = Browse.traits.BrowseItemBrowse -> Book {
33 config {
34 browseLook: feed
35 bodySearch: false
36 fields: [{ name: "name", label: "Title", variant: h4 }, { name: "author", label: "Author", variant: caption }, { name: "status", label: "Status", variant: badge, labels: { active: "On the shelf", pending: "On loan", inactive: "Lost" } }]
37 }
38 }
39
40 trait BookFacts = StatBand.traits.StatBandRender -> LibraryView {
41 config {
42 heading: "The shelf at a glance"
43 items: [{ value: "3", label: "books" }, { value: "1", label: "on loan" }]
44 }
45 }
46
47 page "/library" -> LibraryPage
48}1uses Board from "std/behaviors/std-board"
2
3orbital Hiring = Board.orbitals.BoardOrbital {
4 entity Candidate
5 fields { title: name }
6 extend { referredBy : string = "" }
7 pages { "/board": "/hiring" }
8}Sklic na orbital prinese entiteto, vse lastnosti in vse strani. Njegovo telo lahko entiteto veže drugače, preimenuje polja, z extend doda nova, preslika poti, z omit ali only skrči nabor lastnosti in s config nastavi navedene gumbe orbitala. Uvožena imena dobijo predpono z imenom tvojega orbitala, zato dva uvoza istega vedenja nikoli ne trčita.
Gumbi živijo na lastnosti (trait.config), na orbitalu (gumbi, ki jih objavi prek svojih lastnosti) in na aplikaciji. Lastnost si objavi gumb orbitala ali aplikacije tako, da privzeto vrednost svojega gumba nastavi na @config.<knob>, razreševanje pa gre od mesta klica prek orbitala do aplikacije. Navedeni gumb, ki ga nobena lastnost ne posreduje, je napaka, prav tako prilagoditev gumba, ki ni bil naveden.
1uses lazy Guide from "./guide"
2
3orbital GuideIntro = Guide.orbitals.GuidePage {
4 pages { "/guide": "/guide/intro" }
5}Vedenje z uses lazy se prevede v svojo datoteko in naloži šele, ko se odpre ena od njegovih strani, zato veliko spletišče ne pošlje vseh razdelkov vnaprej. Tako uvoženo ime se sme uporabiti le kot celoten orbital s stranmi. Te strani dokumentacije so vedenja, ki se nalagajo po potrebi.
Prebrskaj, kaj je na voljo v standardni knjižnici in njeni referenci.