Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
AhmedElTabarani opened this issue Jul 30, 2021 · 23 comments
Labels
bug / علة Something isn't working / شيء ما لايعمل documentation / التوثيق Improvements or additions to documentation / اضافة او تحسين التوثيق good first issue Good for newcomers wontfix This will not be worked on

Comments

@AhmedElTabarani
Copy link
Contributor

#ألف

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

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

67

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

#ألف

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

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

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

 الخطأ		: لا يمكن إضافة عملية داخل نص ' - ' 
 
@AhmedElTabarani AhmedElTabarani changed the title دالة اطبع تجمع الارقام كحروف مشكلة مع عمليات على الارقام في النصوص Jul 30, 2021
@MuhammadSawalhy MuhammadSawalhy changed the title مشكلة مع عمليات على الارقام في النصوص مشكلة في التحويل بين الأنواع، نص و عدد Jul 30, 2021
@MuhammadSawalhy
Copy link
Collaborator

قيمة ن هنا "13"

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

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

نص ن =  6 + 7

@MuhammadSawalhy MuhammadSawalhy added bug / علة Something isn't working / شيء ما لايعمل good first issue Good for newcomers labels Jul 30, 2021
@hassandraga
Copy link
Member

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

نص ج = 1 + 2

تصبح بشكل آلي

نص ج = "1" + "2"

تصبح بشكل آلي

نص ج = "12"

@hassandraga hassandraga added the wontfix This will not be worked on label Aug 3, 2021
@AhmedElTabarani
Copy link
Contributor Author

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

اطبع( 6 +7)

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

@hassandraga
Copy link
Member

hassandraga commented Sep 28, 2021

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

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

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

ستعمال

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

@MuhammadSawalhy
Copy link
Collaborator

MuhammadSawalhy commented Sep 28, 2021

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

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

image

@MuhammadSawalhy
Copy link
Collaborator

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

#ألف

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

@hassandraga
Copy link
Member

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

@hassandraga
Copy link
Member

@hassandraga
Copy link
Member

hassandraga commented Sep 28, 2021

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) ) ;

@MuhammadSawalhy
Copy link
Collaborator

أرى ألا نجعل هدفُ جعل اللغة مميزة ومتفردة أن نجعلها غريبة وصادمة في قواعدها. عندما قلت "عكس ما يُتوقع" كان قصدي أنا مخالفة للمنطق أو بتعبير آخر عكس الفطرة البرمجية، كطريقة تفكيرنا في قواعد لغة البرمجة أو حتى اللغات الطبيعية 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"
-- إلخ

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

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

@MuhammadSawalhy
Copy link
Collaborator

MuhammadSawalhy commented Sep 28, 2021

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

سنقع في تعقيدات أخرى عندما نضع ترتيب العمليات واتجاهها، عملية الجمع تأتي من اليسار لليمين 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
-- إلخ

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

@MuhammadSawalhy
Copy link
Collaborator

MuhammadSawalhy commented Sep 28, 2021

الكود الحالي

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

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

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

❤️ 👍

@hassandraga
Copy link
Member

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

https://ideone.com/3aXvqZ

@hassandraga
Copy link
Member

hassandraga commented Sep 28, 2021

#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;
}

@hassandraga
Copy link
Member

أعتقد أن هناك سوء فهم، كل ما قلته تم بالفعل إذا كان المتغير عدد. مشكلتنا الآن هي عندما يكون المتغير نص.

@MuhammadSawalhy
Copy link
Collaborator

MuhammadSawalhy commented Sep 28, 2021

#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";

@hassandraga
Copy link
Member

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

إلى_نص(6+7)

@hassandraga
Copy link
Member

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

هل تتفق معي؟

@MuhammadSawalhy
Copy link
Collaborator

MuhammadSawalhy commented Sep 28, 2021

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

إلى_نص(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) ) ;

@AhmedElTabarani
Copy link
Contributor Author

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

إلى_نص(6+7)

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

مثلا

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

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

@hassandraga
Copy link
Member

@AhmedElTabarani

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

@MuhammadSawalhy
Copy link
Collaborator

MuhammadSawalhy commented Sep 30, 2021

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

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

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

@hassandraga
Copy link
Member

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

@MuhammadSawalhy MuhammadSawalhy added the documentation / التوثيق Improvements or additions to documentation / اضافة او تحسين التوثيق label Dec 31, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug / علة Something isn't working / شيء ما لايعمل documentation / التوثيق Improvements or additions to documentation / اضافة او تحسين التوثيق good first issue Good for newcomers wontfix This will not be worked on
Projects
None yet
Development

No branches or pull requests

3 participants