
Kaj če JSON ne bi bil le zapis podatkov?
Kaj če bi bil programski jezik?
Zgradili smo turingovo poln jezik, ki je strogo podmnožica JSON-a. Brez nove sintakse. Brez lastnega razčlenjevalnika. Vsak program je veljaven JSON.
To je Almadar.
Leta 1958 je John McCarthy v jeziku Lisp predstavil S-expressions (simbolne izraze):
(+ 1 2)
(if (> x 10) "big" "small")S-expression je gnezden seznam, v katerem je prvi element operator.
Tabele v JSON-u so gnezdeni seznami.
["+", 1, 2]
["if", [">", "x", 10], "big", "small"]To je vse.
S-expressions se že popolnoma prilegajo v tabele JSON. Namesto da bi izumljali novo sintakso, razlagamo tisto, kar JSON že izraža.
Program Almadar je sestavljen iz Orbitalov, osnovnih gradnikov sistema.
Vsak Orbital zajema tri osrednje elemente:
Entity določa strukturo podatkov. Deklarira polja, tipe in omejitve.
Je:
Hrani podatke, nad katerimi deluje sistem.
Trait določa vedenje.
Tehnično je Trait ponovno uporabljiv avtomat stanj, povezan z Entity.
Vsebuje:
set in emit, ter druga)Traits zajemajo logiko in jih je mogoče ponovno uporabiti v več orbitalih. So računsko jedro sistema.
Page določa uporabniški vmesnik.
Opisuje:
Pages se odzivajo na stanje Entity in pošiljajo dogodke, ki poganjajo Traits.
{
"name": "ApprovalWorkflow",
"orbitals": [{
"entity": {
"name": "Request",
"fields": [
{ "name": "amount", "type": "number" },
{ "name": "status", "type": "enum", "values": ["pending", "approved", "rejected"] }
]
},
"traits": [{
"name": "ApprovalTrait",
"linkedEntity": "Request",
"stateMachine": {
"states": [
{ "name": "Pending", "isInitial": true },
{ "name": "Approved" },
{ "name": "Rejected" }
],
"transitions": [{
"from": "Pending",
"to": "Approved",
"event": "APPROVE",
"guard": ["and",
[">=", "@user.roleLevel", 3],
["<", "@entity.amount", 10000]
],
"effects": [
["set", "@entity.status", "approved"],
["emit", "REQUEST_APPROVED"]
]
}]
}
}]
}]
}Struktura je JSON. Logika so tabele JSON. Izvajanje je determinirano in rekurzivno.
Guard je pogojni izraz, ki določa, ali se prehod med stanji sme izvesti.
Prehod se sproži samo, če je vrednost njegovega guarda true.
Če je vrednost false, je prehod blokiran.
Guards so čisti izrazi, brez stranskih učinkov.
{
"from": "Pending",
"to": "Approved",
"event": "APPROVE",
"guard": ["and",
[">=", "@user.roleLevel", 3],
["<", "@entity.amount", 10000]
],
"effects": [
["set", "@entity.status", "approved"]
]
}Ta prehod se izvede samo, če:
Če kateri koli pogoj ni izpolnjen, prehod ne naredi ničesar.
Guards se vrednotijo rekurzivno:
["and",
[">=", "@user.roleLevel", 3],
["<", "@entity.amount", 10000]
]Koraki vrednotenja:
@user.roleLevel, @entity.amount)Rezultat mora biti logična vrednost (boolean).
Guards lahko uporabljajo:
and, or, not=, !=, <, >, <=, >=@entity, @user ali @payloadPojmovno je guard enakovreden pogoju if za prehod.
Almadar je turingovo poln, ker ponuja:
set, emit)Samoprehod z guardom in posodobitvami stanja je enakovreden zanki while:
{
"from": "Computing",
"to": "Computing",
"event": "TICK",
"guard": [">", "@entity.counter", 0],
"effects": [
["set", "@entity.counter", ["-", "@entity.counter", 1]],
["emit", "TICK"]
]
}Stanje = pomnilnik. Prehodi = potek upravljanja. Izrazi = računanje.
To je popoln računski model.
Almadar predlaga preprost premik:
Brez nove slovnice. Brez novih sintaktičnih pravil. Samo strukturirano računanje znotraj najbolj univerzalnega zapisa podatkov na svetu.
JSON je že zmagal.
Zdaj lahko tudi misli.