From b1198579adcde2566231d82b3ae464ce92db1c04 Mon Sep 17 00:00:00 2001 From: Sad Lang Dev Date: Wed, 22 Jul 2026 07:45:35 +0300 Subject: [PATCH 1/2] =?UTF-8?q?RFC:=20=D8=AA=D9=85=D8=B1=D9=8A=D8=B1=20?= =?UTF-8?q?=D8=A8=D9=8A=D8=A7=D9=86=D8=A7=D8=AA=20=D8=A7=D9=84=D8=AD=D8=AF?= =?UTF-8?q?=D8=AB=20(EventData)=20=D9=84=D8=B1=D8=AF=D9=88=D8=AF=20=D9=86?= =?UTF-8?q?=D8=AF=D8=A7=D8=A1=20=D8=A7=D9=84=D9=88=D8=A7=D8=AC=D9=87=D8=A9?= =?UTF-8?q?=20=D9=81=D9=8A=20=D8=A7=D9=84=D9=85=D8=AA=D8=B1=D8=AC=D9=85=20?= =?UTF-8?q?(=E2=91=A1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ردود نداء الأحداث في المترجم تُستدعى بلا موضع/دلتا المؤشّر؛ بنية EventData موجودة في وقت التشغيل لكن لا تعبر الحدّ إلى ص. توسيع توقيع ردود النداء وتوليد المترجم لها لتمرير الموضع/الدلتا — يمكّن سحب النوافذ والتفاعل المكانيّ بمنطق ص خالص. Co-Authored-By: Claude Opus 4.8 --- ...31\210\330\247\330\254\331\207\330\251.md" | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 "text/0000-\330\252\331\205\330\261\331\212\330\261-\330\250\331\212\330\247\331\206\330\247\330\252-\330\247\331\204\330\255\330\257\330\253-\331\204\330\261\330\257\331\210\330\257-\331\206\330\257\330\247\330\241-\330\247\331\204\331\210\330\247\330\254\331\207\330\251.md" diff --git "a/text/0000-\330\252\331\205\330\261\331\212\330\261-\330\250\331\212\330\247\331\206\330\247\330\252-\330\247\331\204\330\255\330\257\330\253-\331\204\330\261\330\257\331\210\330\257-\331\206\330\257\330\247\330\241-\330\247\331\204\331\210\330\247\330\254\331\207\330\251.md" "b/text/0000-\330\252\331\205\330\261\331\212\330\261-\330\250\331\212\330\247\331\206\330\247\330\252-\330\247\331\204\330\255\330\257\330\253-\331\204\330\261\330\257\331\210\330\257-\331\206\330\257\330\247\330\241-\330\247\331\204\331\210\330\247\330\254\331\207\330\251.md" new file mode 100644 index 0000000..19b508f --- /dev/null +++ "b/text/0000-\330\252\331\205\330\261\331\212\330\261-\330\250\331\212\330\247\331\206\330\247\330\252-\330\247\331\204\330\255\330\257\330\253-\331\204\330\261\330\257\331\210\330\257-\331\206\330\257\330\247\330\241-\330\247\331\204\331\210\330\247\330\254\331\207\330\251.md" @@ -0,0 +1,76 @@ +- **عنوان المقترح:** تمرير بيانات الحدث (`EventData`: موضع/دلتا) لردود نداء الواجهة في المترجم (②) +- **النطاق:** لغة `text/` +- **تاريخ البدء:** 2026-07-22 +- **رقم الـ RFC:** (يُترك فارغاً حتى الدمج) +- **الحالة:** مقترَح (PR مفتوح) +- **Issue التتبُّع:** (يُترك فارغاً حتى القبول) + +# ملخّص + +ردود نداء أحداث الواجهة (مثل `عند_النقر`) في المترجم `sadc` تُستدعى **بلا بيانات الحدث**: لا تتلقّى إحداثيّات المؤشّر ولا دلتا الحركة. يقترح هذا الـ RFC توسيع توقيع ردود نداء الأحداث (وتوليد المترجم لها) لتمرير بنية `EventData` (x، y، deltaX، deltaY، نوع الحدث) الموجودة أصلًا في وقت التشغيل إلى منطق ص. النتيجة المرئيّة: برامج ص تفاعليّة تعرف **أين** وقع الحدث — فتُبنى وظائف كسحب النوافذ والرسم بالمؤشّر بمنطق ص خالص. + +# الدافع (Motivation) + +مدير نوافذ بيئة سطح المكتب بلغة ص (المتطلّب FR-009) يتطلّب **سحب شريط العنوان لتحريك النافذة** — وهذا يحتاج معرفة موضع المؤشّر ودلتا حركته في منطق ص. كشفت مراجعة معماريّة، وأكّدتها مراجعة تنفيذيّة، أنّ: + +- `dispatchCompiledEvent(const IRNode*, IREventType)` يستدعي `b.cb(b.data)` فقط (`sad_ui_runtime.cpp:911-936`) — ردّ النداء يتلقّى بيانات إغلاقه لا غير. +- توقيع `FreestandingAppConfig.onEvent` بلا `EventData`، والجسر يُسقطها (`sad_ui_runtime.cpp:1126-1128`). +- بنية `EventData{x, y, deltaX, deltaY}` موجودةٌ في وقت التشغيل (`types.h:486-494`) لكنّها **لا تعبر الحدّ** إلى ص. + +⇒ من غير هذا التوسيع، **يتسرّب منطق السحب حتمًا إلى C++** (كسر قيد «السياسة في ص، الآليّة في المكتبة»)، أو يتعذّر FR-009 كليًّا. + +# الشرح التوجيهي (Guide-level explanation) + +```sad +# ردّ نداء يتلقّى بيانات الحدث (موضع/دلتا) — يعمل مترجَمًا +دالة عند_سحب_الشريط(حدث) + # حرّك النافذة المركَّزة بمقدار حركة المؤشّر + النافذة.س += حدث.دلتا_س + النافذة.ص += حدث.دلتا_ص +نهاية + +شريط_عنوان("عنوان النافذة") + .عند_السحب(عند_سحب_الشريط) +``` + +اليوم يكتب المستخدم `عند_النقر(دالّة)` والدالّة بلا وسائط. بعد المقترح، ردود نداء الأحداث المكانيّة تتلقّى وسيط `حدث` يحمل الموضع والدلتا — فيصير التفاعل المكانيّ (سحب/إفلات/رسم) ممكنًا بلغة ص. + +# الشرح المرجعي (Reference-level explanation) + +- **مصدر الحقيقة (`language-truth/`):** تعريف نوع/بنية `حدث` (EventData) في مصدر الحقيقة، وربط أنواع ردود نداء الأحداث المكانيّة بها. +- **المحلل النحوي/AST:** لا صياغة جديدة إن مُرِّر الوسيط كبنية عاديّة؛ قد يلزم تمييز ردود النداء المكانيّة (تحمل وسيطًا) عن الفعليّة (بلا وسيط). +- **المفسّر:** توحيد سلوك تمرير الحدث مع المترجم (قد يمرّره فعلًا أو يلزمه محاذاة). +- **المترجم (sadc) — جوهر المقترح:** توليد SIR/LLVM لتواقيع ردود نداء الأحداث بحيث تستقبل مؤشّر/قيمة `EventData`؛ تعديل `dispatchCompiledEvent` ليمرّر `EventData` من الحلقة (`sad_ui_runtime.cpp:911-936`)، وتعديل `cfg.onEvent`/الجسر الحرّ (`:1126-1128`) لتمرير الموضع/الدلتا. +- **نظام الأخطاء:** تحقّق تطابق توقيع ردّ النداء (بوسيط حدث مقابل بلا وسيط). +- **الأدوات:** LSP يعرض توقيع ردّ النداء الجديد؛ المقتطفات تُحدَّث. +- **التوافق الخلفي:** يجب أن تبقى ردود النداء بلا وسيط (`عند_النقر` بلا معامل) صالحةً — التوسيع **اختياريّ**: من يريد الموضع يعلن وسيط الحدث. + +# السلبيات (Drawbacks) + +- أكبر المقترحات الثلاثة أثرًا: يمسّ **توليد المترجم لتواقيع ردود النداء** — غير تافه ويلزمه اختبار انحدار للأحداث القائمة. +- ازدواج تواقيع ردود النداء (بوسيط/بلا وسيط) يزيد تعقيد التحقّق. + +# المبرّرات والبدائل (Rationale and alternatives) + +- **الأفضل**: تمرير بنية `EventData` الموجودة أصلًا؛ يعيد استعمال بنية وقت التشغيل بلا اختراع نموذج جديد، ويحفظ المبدأ (السياسة في ص). +- **بديل مرفوض**: قراءة موضع المؤشّر في C++ وتنفيذ السحب هناك — يكسر قيد المنطق-في-ص، ويبني سابقة لتسرّب منطق البيئة. +- **بديل مرفوض**: مدمَج `موضع_المؤشّر()` عالميّ يُستقصى — يفصل الموضع عن الحدث ويولّد سباقات (الموضع وقت الاستعلام لا وقت الحدث). +- **أثر عدم الفعل**: تعذّر FR-009 (سحب النوافذ)؛ حجب مدير النوافذ (المكوّن الجوهريّ) أو كسر قيد المنطق-في-ص. + +# أعمال سابقة (Prior art) + +- المتصفّح/DOM: معالِج الحدث يتلقّى `event` بـ`clientX/clientY/movementX`. Qt: `QMouseEvent`. Flutter: `GestureDetector` يمرّر `DragUpdateDetails.delta`. الدرس الموحَّد: الحدث المكانيّ يحمل موضعه ودلتاه إلى المعالِج — وهو ما يعتمده هذا المقترح. + +# أسئلة غير محسومة (Unresolved questions) + +- تمييز ردود النداء المكانيّة (بوسيط) عن الفعليّة (بلا وسيط): بالاستدلال من إعلان المعامل أم بأسماء أحداث مخصّصة (`عند_السحب` مقابل `عند_النقر`)؟ (يُحسم قبل الدمج.) +- شكل بنية `حدث` المكشوفة لـص (حقول موحّدة؟). (يُحسم قبل الدمج.) +- تكامل مع hit-test متعدّد النوافذ (توجيه الحدث للنافذة الصحيحة) — منطق ص، خارج نطاق هذا الـ RFC. + +# إمكانات مستقبلية (Future possibilities) + +أحداث لوحة المفاتيح الغنيّة (رمز/معدِّلات) لردود ص، أحداث اللمس/الإيماءات، إفلات السحب (drag-and-drop) بين النوافذ، تمرير عجلة الفأرة. + +--- + +> **السياق**: آليّةٌ حاجزة في خطّة بيئة سطح المكتب الرسوميّة بلغة ص (الوضع الحرّ)، كشفتها مراجعة معماريّة. مقترحان شقيقان: [[0000-مدمج-الوقت-الحالي-للمترجم]] و[[0000-مدمجات-نظام-الملفات-في-المترجم-للوضع-الحر]]. هذا أضخم الثلاثة أثرًا على المترجم. From 36f66105584a1b1cd62e4903f1decdee540912a5 Mon Sep 17 00:00:00 2001 From: Sad Lang Dev Date: Thu, 23 Jul 2026 00:30:08 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D8=AD=D8=A7=D9=84=D8=A9:=20rfcs#46=20?= =?UTF-8?q?=C2=AB=D9=85=D9=82=D8=A8=D9=88=D9=84=C2=BB=20=E2=80=94=20=D9=85?= =?UTF-8?q?=D9=8F=D9=86=D9=81=D9=8E=D9=91=D8=B0=20=D8=B7=D8=B1=D9=81=D9=8B?= =?UTF-8?q?=D8=A7=20=D9=84=D8=B7=D8=B1=D9=81=20(PR=20=D8=B1=D9=82=D9=85=20?= =?UTF-8?q?251)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ② EventData نُفِّذت في المترجم والمفسّر: بنية «حدث» بـ19 حقلًا مشتقّة من SoT، ثانك واعٍ بالأرية يبنيها من POD، تكافؤ المحرّكين. جولتا مراجعة خصميّة، بناء أخضر. ديون التفرّع (خ-11) وتعداد نوع الحدث (خ-12) تُسجَّلان كـRFCي متابعة. Co-Authored-By: Claude Opus 4.8 --- ...\247\331\204\331\210\330\247\330\254\331\207\330\251.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/text/0000-\330\252\331\205\330\261\331\212\330\261-\330\250\331\212\330\247\331\206\330\247\330\252-\330\247\331\204\330\255\330\257\330\253-\331\204\330\261\330\257\331\210\330\257-\331\206\330\257\330\247\330\241-\330\247\331\204\331\210\330\247\330\254\331\207\330\251.md" "b/text/0000-\330\252\331\205\330\261\331\212\330\261-\330\250\331\212\330\247\331\206\330\247\330\252-\330\247\331\204\330\255\330\257\330\253-\331\204\330\261\330\257\331\210\330\257-\331\206\330\257\330\247\330\241-\330\247\331\204\331\210\330\247\330\254\331\207\330\251.md" index 19b508f..2345a3a 100644 --- "a/text/0000-\330\252\331\205\330\261\331\212\330\261-\330\250\331\212\330\247\331\206\330\247\330\252-\330\247\331\204\330\255\330\257\330\253-\331\204\330\261\330\257\331\210\330\257-\331\206\330\257\330\247\330\241-\330\247\331\204\331\210\330\247\330\254\331\207\330\251.md" +++ "b/text/0000-\330\252\331\205\330\261\331\212\330\261-\330\250\331\212\330\247\331\206\330\247\330\252-\330\247\331\204\330\255\330\257\330\253-\331\204\330\261\330\257\331\210\330\257-\331\206\330\257\330\247\330\241-\330\247\331\204\331\210\330\247\330\254\331\207\330\251.md" @@ -1,9 +1,9 @@ - **عنوان المقترح:** تمرير بيانات الحدث (`EventData`: موضع/دلتا) لردود نداء الواجهة في المترجم (②) - **النطاق:** لغة `text/` - **تاريخ البدء:** 2026-07-22 -- **رقم الـ RFC:** (يُترك فارغاً حتى الدمج) -- **الحالة:** مقترَح (PR مفتوح) -- **Issue التتبُّع:** (يُترك فارغاً حتى القبول) +- **رقم الـ RFC:** 46 +- **الحالة:** مقبول (مُنفَّذ طرفًا لطرف في المحرّكين؛ PR التنفيذ رقم 251 نحو dev، جولتا مراجعة خصميّة، بناء ذرّيّ أخضر) +- **Issue التتبُّع:** sadlang/s-programming-language#251 # ملخّص