
ماذا لو لم يكن JSON مجرد صيغة للبيانات؟
ماذا لو كان لغة برمجة؟
بنينا لغة كاملة بمعيار تورنغ وهي مجموعة جزئية صارمة من JSON. لا صياغة جديدة. لا محلّل مخصص. كل برنامج هو JSON صالح.
هذه هي المدار.
في عام 1958 قدّم John McCarthy تعبيرات S-expression (تعبيرات رمزية) في Lisp:
(+ 1 2)
(if (> x 10) "big" "small")الـ S-expression قوائم متداخلة، وعنصرها الأول هو العامل.
ومصفوفات JSON قوائم متداخلة.
["+", 1, 2]
["if", [">", "x", 10], "big", "small"]هذا كل شيء.
الـ S-expression تتسع أصلًا داخل مصفوفات JSON بشكل مثالي. وبدل أن نخترع صياغة جديدة، نفسّر ما يعبّر عنه JSON أصلًا.
يتكوّن برنامج المدار من Orbitals، وهي اللبنات الأساسية للنظام.
يضم كل Orbital ثلاثة عناصر أساسية:
تحدد الـ Entity بنية البيانات. تعلن الحقول والأنواع والقيود.
وهي:
تحمل البيانات التي يعمل عليها النظام.
تحدد الـ Trait السلوك.
من الناحية التقنية، الـ Trait آلة حالة قابلة لإعادة الاستخدام مرتبطة بـ Entity.
وهي تحتوي على:
set وemit وغيرها)تغلّف الـ Traits المنطق ويمكن إعادة استخدامها عبر الـ orbitals. وهي القلب الحسابي للنظام.
تحدد الـ Page واجهة المستخدم.
وتصف:
تتفاعل الصفحات مع حالة الـ Entity وترسل أحداثًا تقود الـ 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"]
]
}]
}
}]
}]
}البنية هي JSON. والمنطق مصفوفات JSON. والتنفيذ حتمي ومتكرر ذاتيًا.
الـ Guard تعبير شرطي يحدد ما إذا كان يُسمح بتنفيذ انتقال بين حالتين.
لا يُطلق الانتقال إلا إذا كانت قيمة الـ guard تساوي true.
وإذا كانت false فإن الانتقال يُمنع.
الـ Guards تعبيرات خالصة، وليس لها أي آثار جانبية.
{
"from": "Pending",
"to": "Approved",
"event": "APPROVE",
"guard": ["and",
[">=", "@user.roleLevel", 3],
["<", "@entity.amount", 10000]
],
"effects": [
["set", "@entity.status", "approved"]
]
}لا يعمل هذا الانتقال إلا إذا:
وإذا فشل أحد الشرطين فلا يفعل الانتقال شيئًا.
تُقيَّم الـ Guards تقييمًا متكررًا ذاتيًا:
["and",
[">=", "@user.roleLevel", 3],
["<", "@entity.amount", 10000]
]خطوات التقييم:
@user.roleLevel و@entity.amount)ويجب أن تكون النتيجة قيمة منطقية (boolean).
يمكن أن تستخدم الـ Guards:
and وor وnot= و!= و< و> و<= و>=@entity أو @user أو @payloadمن الناحية المفهومية، الـ guard يعادل شرط if للانتقال.
المدار كاملة بمعيار تورنغ لأنها توفّر:
set وemit)الانتقال الذاتي مع guard وتحديثات للحالة يعادل حلقة while:
{
"from": "Computing",
"to": "Computing",
"event": "TICK",
"guard": [">", "@entity.counter", 0],
"effects": [
["set", "@entity.counter", ["-", "@entity.counter", 1]],
["emit", "TICK"]
]
}الحالة = الذاكرة. الانتقالات = تدفق التحكم. التعبيرات = الحساب.
وهذا نموذج حسابي كامل.
تقترح المدار تحولًا بسيطًا:
لا قواعد نحوية جديدة. لا قواعد صياغة جديدة. فقط حساب منظّم داخل أكثر صيغ البيانات عالمية في العالم.
JSON فاز أصلًا.
والآن يستطيع أن يفكّر.