alifcommunity/compiler

مشكلة في التحويل بين الأنواع، `نص` و `عدد`

AhmedElTabarani opened this issue · 23 comments

#ألف

دالة رئيسية 
	اطبع (6 + 7)
نهاية دالة

يخرج الناتج كهذا

67

او في عملية الطرح

#ألف

دالة رئيسية 
	اطبع (6 - 7)
نهاية دالة

يخرج الناتج كهذا

 الملف		: Temp\temp.alif
 السطر		: 4

 الخطأ		: لا يمكن إضافة عملية داخل نص ' - ' 
 

قيمة ن هنا "13"

عدد ع = 6 + 7
نص ن = ع

والنفترض أن تكون القيمة هنا نفسها، "13"

نص ن =  6 + 7
لغة ألف صممت منذ البداية بتحويل الأعداد إلى نصوص عند الحاجة بشكل آلي، لدى فكل النواتج المذكورة هي صحيحة، مثلا:

نص ج = 1 + 2

تصبح بشكل آلي

نص ج = "1" + "2"

تصبح بشكل آلي

نص ج = "12"

واذا اراد شخص طباعة عمليات رياضية جمع رقمين او طرح، ماذا نفعل ؟

اطبع( 6 +7)

الناتج يكون 67 كيف نجعله يطبع 13

شخص ما عليه إضافة دالة تحويل عدد إلى نص هنا:

https://github.com/alifcommunity/compiler/blob/main/aliflib/alifstandardlib.alif

دالة نص إلى_نص (عدد ن)
    إرجاع ن
نهاية دالة 

ستعمال

اطبع ( إلى_نص(6+7) )

فكرة التحويل إلى نص تلقائيا للأعداد قبل الجمع في حالة نص ن = 1+2 لا أراها فكرة جيدة، قمثلا بمراجعة شجرة السابر (المحلل) في موقع https://astexplorer.net/ ستجد أن 1 و 2 عبارة عن عقدتين nodes في الشجرة متفرعتين من عقدة ولنسمها "عملية الجمع"، والتي هي عقدة بداخل جملة تعريف المتغير ن، وهذا يعني أن عملية الجمع تتم أولا ثم يأتي بعد ذلك إسناد القيمة للمتغير الجاري تعريفه، بمعنى آخر: عملية التحويل للنص تأتي بعد إجراء الجمع:

وجدت ما تقوم به ألف حاليا أمرا مفاجئا وغير متوقع، وظننت أنا مشكلة للوهلة الأولى، لكن إن شاء الله نستقر على قرار يحعل اللغة سهلة ومألوفة

image

حتى إن كودا كهذا يحول الأرقام أولا لنصوص. عكس ما يُتوقع.

#ألف

دالة رئيسية 
	نص ن = (1 + 2)
	اطبع(ن)
نهاية دالة
12

أشكركم على مشاركة هذا ، وأنا أعلم ذلك ، ولكن تم تصميم ألف بطريقة معينة لا تشبه اللغات الأخرى. ولكن لتسهيل الأمور على المستخدم ، يمكننا تغيير تصميم Alif core لإصلاح هذه المشكلة.

helloworld.alif
#ألف
دالة رئيسية 
	نص ن = (1 + 2)
	اطبع(ن)
نهاية دالة

ترجمة

alif helloworld.alif --debug

فتح الملف

/tmp/alifcompiler_0000.cpp

الكود الحالي

std::string V_10007 = ( alifcore_IntToString(1) + alifcore_IntToString(2) ) ;

الكود المطلوب

std::string V_10007 = ( alifcore_IntToString(1 + 2) ) ;

أرى ألا نجعل هدفُ جعل اللغة مميزة ومتفردة أن نجعلها غريبة وصادمة في قواعدها. عندما قلت "عكس ما يُتوقع" كان قصدي أنا مخالفة للمنطق أو بتعبير آخر عكس الفطرة البرمجية، كطريقة تفكيرنا في قواعد لغة البرمجة أو حتى اللغات الطبيعية parser tree، فعملية الجمع يفترض أن تتم قبل عملية تعيين القيمة للمتغير ن، وعند التعيين نجد أنه من النوع نص، وحينها يُحول المتغير لهذا النوع.


يمكن أن افترض أن طريقة عمل اللغة في هذه الحالة أن يحول كل القيم لنص ثم دمجها مع التي تليها تِباعا

نص ن =  1  +  2  +  3
نص ن = "1" +  "2"  +  "3"
نص ن = "123"
-- إلخ

في حالة وجود أقواس:

نص ن = 1 + (2 + 3) + 4
نص ن = 1 + 5 + 4
نص ن = "1" + "5" + "4"
نص ن = "154"
-- إلخ

وفي حالة وجود دالة:

نص ن = 1 + ضرب(2، 3) + 4
نص ن = 1 + 6 + 4
نص ن = "1" + "6" + "4"
نص ن = "164"
-- إلخ

هكذا تكون لغة منضبطة في قواعدها، مع التمسك برأيي أن القاعدة نفسها غريبة ومخالفة للفطرة البرمجية...

أود التنويه أن الاختلاف ليس هدف الانتصار لنفسي أو التقليل من الأداء الحالي، بل هدفه الصعود باللغة لمستوياتٍ أعلى وضبط قواعدها.

هكذا تكون لغة منضبطة في قواعدها، مع التمسك برأيي أن القاعدة نفسها غريبة ومخالفة للفطرة البرمجية...

سنقع في تعقيدات أخرى عندما نضع ترتيب العمليات واتجاهها، عملية الجمع تأتي من اليسار لليمين ltr في كل اللغات، فما تتوقعه الفطرة البرمجة أن يكون أداء ألف هكذا:

نص ن =  1  +  2  +  3  + ... + 7
نص ن = "1" +  2  +  3  + ... + 7
نص ن = "1" + "2" +  3  + ... + 7
نص ن =   "12"    +  3  + ... + 7
نص ن =   "12"    + "3" + ... + 7
نص ن =       "123"     + ... + 7
-- إلخ

في حالة وجود أقواس:

نص ن = 1   + (2 + 3) + ... + 7
نص ن = "1" + (2 + 3) + ... + 7
نص ن = "1" +  5      + ... + 7
نص ن = "1" + "5"     + ... + 7
نص ن =    "15"       + ... + 7
-- إلخ

وفي حالة وجود دالة:

نص ن = 1   + ضرب(2، 3) + ... + 7
نص ن = "1" + ضرب(2، 3) + ... + 7
نص ن = "1" +    6      + ... + 7
نص ن = "1" +   "6"     + ... + 7
نص ن =      "16"       + ... + 7
-- إلخ

أرجو أن تُكتب توصيفات اللغة بهذه التفاضيل قريبا حتى قبل العمل على مزايا جديدة، لأنه سينج بيئة للنقاش حول خصائص اللغة وفهمها ثم يأتي التطبيق وصنع مترجم اللغة (أو استكماله في حالتنا)

الكود الحالي

std::string V_10007 = ( alifcore_IntToString(1) + alifcore_IntToString(2) ) ;

الكود المطلوب

std::string V_10007 = ( alifcore_IntToString(1 + 2) ) ;

❤️ 👍

أنا أتفق معك ، لكن لا يمكنني إعادة إنتاج ما قلته بلغة C ++. هل يمكنك أن تعطيني مثالا من فضلك؟

https://ideone.com/3aXvqZ

#include <iostream>
#include <string.h>
using namespace std;
 
void alifprint(string s){
    std::cout << s << endl;
}
 
int main() {
    int n  = 1 + 2 + (3 + 4) + 5; // OK
    string s = 1 + 2 + (3 + 4) + 5; // needs to_string(...)
    alifprint(s);
    return 0;
}
أعتقد أن هناك سوء فهم، كل ما قلته تم بالفعل إذا كان المتغير عدد. مشكلتنا الآن هي عندما يكون المتغير نص.
#include <iostream>
#include <string.h>
using namespace std;
 
void alifprint(string s){
    std::cout << s << endl;
}
 
int main() {
    int n  = 1 + 2 + (3 + 4) + 5; // OK
    // تؤدي العرض المطلوب فعلا
    // التحويل للنص هو آخر الخطوات
    string s = to_string(1 + 2 + (3 + 4) + 5);
    alifprint(s);
    return 0;
}

الخطوات:

string s = to_string(1 + 2 + (3 + 4) + 5);
string s = to_string(3 + (3 + 4) + 5);
string s = to_string(3 + 7 + 5);
string s = to_string(10 + 5);
string s = to_string(15);
string s = "15";

نعم، ولهذا السبب إقترحت إنشاء دالة جديدة لهذا الغرض

إلى_نص(6+7)

بدلا من تغيير شكل وتصميم اللغة وهذا يتطلب وقت. لنتركها هكذا مثل باقي اللغات، كل ما علينا فعله هو إنشاء دالة إلى_نص

هل تتفق معي؟

نعم، ولهذا السبب إقترحت إنشاء دالة جديدة لهذا الغرض

إلى_نص(6+7)

بدون إنشاء دالة جديدة، لغة ألف على حسب علمي ديناميكية، فلندع التحويل يجري تلقائيا. إجراء كل العمليات أولا ثم تحويل الناتج لنص، وهذا يحصل عن طريق كا اقترحته يا حسن:

الكود الحالي

std::string V_10007 = ( alifcore_IntToString(1) + alifcore_IntToString(2) ) ;

الكود المطلوب

std::string V_10007 = ( alifcore_IntToString(1 + 2) ) ;

المطلوب هو:

std::string V_10007 = alifcore_IntToString( (1 + 2) ) ;

نعم، ولهذا السبب إقترحت إنشاء دالة جديدة لهذا الغرض

إلى_نص(6+7)

لا داعي لإنشاء دالة 'إلى_نص'
يمكننا بناء التحويل لن عن طريق الـ Constructor الخاص بصنف النص

مثلا

نص ن = نص(15)
هكذا الكونستراكتور سيحول ال 15 ل نص
نفس الكلام مع صنف العدد

عدد ع = عدد("15")

@AhmedElTabarani

عدد، و نص، ليسا كائنين في لغة ألف، لذلك لا يوجد مُنشئ كائن.

@AhmedElTabarani
عدد، و نص، ليسا كائنين في لغة ألف، لذلك لا يوجد مُنشئ كائن.

بما أننا نحول كود ألف إلى سي++، فربما يمكمننا هذا عن طريق تحويل التعبير نص(...) إلى to_string(...)

الدالة إلى_نص ستفي بالغرض، لكن اقتراح @AhmedElTabarani كان من أجل تسهيل اللغة وجعلها مألوفة دون الحاجة لحفظ الكثير من الدوال.

جاري تطوير نسخة جديدة بتغيير داخلي جذري، حيث لاوجود ل ' نص ' أو ' عدد '، وإنما ' متغير ' حيث هو عبارة عن كائن يقبل ويعطي كل أنواع البيانات، شيئ ما شبيه بخورزميات عمل جافاسكريبت.