سؤال

أقوم حاليًا بتطوير لغة جديدة للبرمجة في بيئة مستمرة (قارنها بالهندسة الكهربائية) ، ولدي بعض الأفكار حول بناء لغة معينة.

اسمحوا لي أن أشرح الميزة بالتفسير ثم بحكم التعريف:

x = a U b;

أين x هو متغير و a و b هي متغيرات أخرى (أو قيم ثابتة). هذا يعمل مثل الاتحاد بين a و b; ؛ لا التكرارات ولا ترتيب محدد.

with(x) {
    // regular 'with' usage; using the global interpretation of "x"
    x = 5;
    // effectively will do:
    // x = a U b U 5;
    // a = 5;
    // b = 5;
    // Thus, when "a" or "b" changes, "x" is still equal to "5".
}
with(x = a) {
    // this code block is executed when the "x" variable
    // has the "a" variable assigned. All references in
    // this code-block to "x" are references to "a". So saying:
    x = 5;
    // would only change the variable "a". If the variable "a"
    // later on changes, x still equals to 5, in this fashion:
    // 'x = a U b U 5;'
    // '[currentscope] = 5;'
    // thus, 'a = 5;'
}
with(x = b) {
    // same but with "b"
}
with(x != a) {
    // here the "x" variable refers to any variable
    // but "a"; thus saying
    x = 5;
    // is equal to the rewriting of
    // 'x = a U b U 5;'
    // 'b = 5;' (since it was the scope of this block)
}
with(x = (a U b)) {
    // guaranteed that "x" is 'a U b'; interacting with "x"
    // will interact with both "a" and "b".
    x = 5;
    // makes both "a" and "b" equal to 5; also the "x" variable
    // is updated to contain:
    // 'x = a U b U 5;'
    // '[currentscope] = 5;'
    // 'a U b = 5;'
    // and thus: 'a = 5; b = 5;'.
}
// etc.

في ما سبق ، يتم تنفيذ جميع حاصرات التعليمات البرمجية ، ولكن يتغير "النطاق" في كل كتلة x يتم تفسيره. في الكتلة الأولى ، x مضمون ليكون a: وبالتالي التفاعل مع x داخل تلك الكتلة سوف تتفاعل عليها a. إن كتلة الكود الثانية والثالثة متساوية فقط في هذا الموقف (لأن not a: ثم يبقى فقط b). تضمن الكتلة الأخيرة ذلك x هذا على الاقل a أو b.

بالإضافة إلى؛ U ليس "bitwise أو المشغل" ، لكنني أسميته "و/أو" يعمل. تعريفه هو:

"U" = "and" U "or"

(على مدونتي ، http://cplang.wordpress.com/2009/12/19/binop-and-or/, ، هناك المزيد من المعلومات الأساسية (الرياضية) حول هذا المشغل. إنه يعتمد بشكل فضفاض على مجموعات. باستخدام بناء جملة مختلف ، غيره في هذا السؤال.)

تحديث: المزيد من الأمثلة.

print = "Hello world!" U "How are you?"; // this will print
                                         // both values, but the
                                         // order doesn't matter.
// 'userkey' is a variable containing a key.
with(userkey = "a") {
    print = userkey; // will only print "a".
}
with(userkey = ("shift" U "a")) {
    // pressed both "shift" and the "a" key.
    print = userkey; // will "print" shift and "a", even
                     // if the user also pressed "ctrl":
                     // the interpretation of "userkey" is changed,
                     // such that it only contains the matched cases.
}
with((userkey = "shift") U (userkey = "a")) {
    // same as if-statement above this one, showing the distributivity.
}

x = 5 U 6 U 7;
y = x + x; // will be:
// y = (5 U 6 U 7) + (5 U 6 U 7)
//   = 10 U 11 U 12 U 13 U 14

somewantedkey = "ctrl" U "alt" U "space"
with(userkey = somewantedkey) {
    // must match all elements of "somewantedkey"
    // (distributed the Boolean equals operated)
    // thus only executed when all the defined keys are pressed
}
with(somewantedkey = userkey) {
    // matches only one of the provided "somewantedkey"
    // thus when only "space" is pressed, this block is executed.
}

Update2: المزيد من الأمثلة وبعض السياق المزيد.

with(x = (a U b)) {
    // this
}
// can be written as
with((x = a) U (x = b)) {
    // this: changing the variable like
    x = 5;
    // will be rewritten as:
    // a = 5 and b = 5
}

بعض المعلومات الأساسية: أقوم ببناء لغة "مستقلة عن الوقت" ، مثل Java هي "منصة مستقلة". كل ما هو مذكور في اللغة "كما هو" ، ويتم تنفيذها بشكل مستمر. هذا يعنى؛ لا يعرف المبرمج أي ترتيب (ما لم ينص صراحة باستخدام الإنشاءات) ، ولا عند تنفيذ العبارات. يتم فصل اللغة تمامًا عن "الوقت"-مفهوم ، أي يتم تنفيذه باستمرار:

with(true) {
    a = 0; // only runs once (lazy execution)
}

with(a < 5) {
    a++;
} // this is a loop-structure;
  // how and when it's executed isn't known however.

with(a) {
    // everytime the "a" variable changes, this code-block is executed.
    with(true) {
        b = 3; // only 5 times (again lazy execution, but it's a sub-with)
    }
    with(b < 2) { // dependent on "b"
        // runs only 3 times * 5 times = 15 times.
    }
    with(b > 1) { // dependent on "b"
        b = b - 1; // runs 4 times * 5 times = 20 times.
    }
}

تحديث 3:

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

أشكركم جميعًا على تزويدني بمعلومات وروابط/تلميحات رائعة للغاية لمواضيع رائعة يمكنني البحث فيها. شكرًا.

لا أعرف ما إذا كان هذا البناء موجودًا بالفعل ، لذلك هذا هو سؤالي: هل توجد ميزة اللغة هذه بالفعل؟

هل كانت مفيدة؟

المحلول

أجد بصراحة شرحك وأمثلة من الصعب متابعتها (تحديث: مدونتك أفضل بكثير والقراءة ترتيب البيان هناك أكثر مقتنعا أنك تهدف إلى شكل من أشكال برمجة البيانات).

ومع ذلك ، وصفك النهائي:

كل ما هو مذكور في اللغة "كما هو" ، ويتم تنفيذها بشكل مستمر. هذا يعنى؛ لا يعرف المبرمج أي ترتيب (ما لم ينص صراحة باستخدام الإنشاءات) ، ولا عند تنفيذ العبارات. يتم فصل اللغة تمامًا عن "الوقت"-مفهوم ، أي يتم تنفيذه باستمرار: قول "A" A "B" و "B" هو "A" هي بنية حلقة بسيطة ، على سبيل المثال.

.. يحثني على التفكير في أن المصطلح العام الذي تبحث عنه هو برمجة البيانات (حتى لو لم يتم السماح بالحلقات في مثيلات برمجة بيانات البيانات الأكثر بساطة). نقلاً عن ويكيبيديا:

تدفق البيانات هي بنية البرمجيات تستند إلى فكرة أن تغيير قيمة المتغير يجب أن يجبر تلقائيًا إعادة حساب قيم المتغيرات التي تعتمد على قيمتها.

البرمجة التفاعلية و البرمجة التفاعلية الوظيفية نكون، مثل أنا افهمهم, ، الاختلافات على نفس الموضوع.

التقييم الموجه للأهداف أكثر تقييدًا في النطاق (انظر هذا مقدمة موجزة عن الرمز: يقتصر التراجع الذي ينطوي عليه آلية التقييم الموجهة إلى التعبير الذي يحدث فيه).

انظر أيضًا هذا السؤال على Stackoverflow: لغات برمجة بيانات البيانات.

تحديث: يسأل Pindatjuh في التعليقات "هل يمكنك أيضًا التعليق ، سواء كانت هذه اللغة تباينًا جديدًا في موضوع تدفق البيانات؟"أعتقد ذلك ، لكن السؤال يتعلق حقًا بالتعاريف والتوافق في الإجماع. في دراسة استقصائية حديثة حول لغات تدفق البيانات ، التقدم في لغات برمجة البيانات (نشرت في استطلاعات ACM الحوسبة ، المجلد 36 ، العدد 1 ، مارس 2004) ، كتب المؤلفون (صفحة 10):

تم طرح أفضل قائمة من الميزات التي تشكل لغة تدفق البيانات من قبل Ackerman [1982] وتكرارها من قبل Whiting و Pascoe [1994] و Wail و Abramson [1995]. تتضمن هذه القائمة ما يلي:

  1. التحرر من الآثار الجانبية ،
  2. موقع التأثير ،
  3. تبعيات البيانات تعادل الجدولة ،
  4. مهمة واحدة للمتغيرات ،
  5. تدوين غير عادي للتكرار بسبب الميزات 1 و 4 ،
  6. نقص حساسية التاريخ في الإجراءات.

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

تحديث: لقد فاتني كلمة "جديدة" في سؤالك "... هذه اللغة الجديد التباين في ..."إنها مهمة صعبة: يحتاج المرء إلى النظر في جميع لغات تدفق البيانات التي تم اختراعها حتى الآن وفحص دلالاتها بعناية بالتفصيل لاكتشاف حداثة في نهجك. أنا بالتأكيد ليس لدي المعرفة اللازمة في هذا الوقت.

نصائح أخرى

أجد هذا صعبًا متابعته ، لكن هل تقصد ذلك:

x == a | b 

سيكون بناء جملة السكر مكافئًا لـ:

(x == a) || (x == b)

في منشور المدونة ، تعطي هذا المثال:

1 + (2|3)

لذا فإن نوع هذا التعبير هو زوج من الأعداد الصحيحة مع القيم 3 و 4 ، كل منها يمثل إحدى القيم المحتملة. لذلك يمكننا أن نقول أيضًا:

4 == (1 + (2|3)
3 == (1 + (2|3)

وكلاهما سيقوم بتقييم صحيح. لذلك المشغل == يمكن مقارنة قيمة مع نوع من متجه القيم وسيكون true إذا كانت أي من القيم في المتجه تساوي القيمة الأولى.

يمكن تنفيذ ذلك باستخدام التحميل الزائد للمشغل ببضع لغات (على الرغم من أنه يتعين عليك "رفع" بشكل صريح في نوع الغلاف قبل أن تتمكن من العمل عليها).

أليس هذا هو نفسه اتحاد مجموعتين ، ومع == تم تفسيره على أنه "هو عضو في"؟ ويتم رفع المشغلين مثل + حتى يطبقوا على جميع أعضاء المجموعة.

وإذا فعلت (1 | 2) + (4 | 8) ستحصل على ما يعادل (5 | 9 | 6 | 10) ، لأن هذه هي النتائج الأربعة المحتملة.

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

بخصوص بيانك:

يتم فصل اللغة تمامًا عن "الوقت"-مفهوم

هل نظرت كثيرًا إلى اللغات الوظيفية النقية مثل هاسكل؟ البرامج عبارة عن سلسلة من التعاريف التي لا تحتوي على ترتيب معروف للتنفيذ ، يمكنك فقط كتابة وظائف نقية بدون آثار جانبية ، وبالتالي يمكن للمترجم المترجم أن يطلب التنفيذ ولكنه يحب طالما توفر القيم عند الحاجة بالفعل.

تحديث:

لقد أضفت هذا إلى سؤالك:

if(x == a | b) {
    // this 
}
// can be written as
if((x == a) | (x == b)) {
    // this
}
// which can be written as
if(x == a) {
    // this
}
if(x == b) {
    // with this
}

أتساءل كيف تعتقد أن هذا سيضيء!

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

if (x == a || x == b) {
    // this
}

حيث || هو المنطق التقليدي أو. وهو بالضبط السؤال الذي طرحته لأول مرة.

حسنًا ، مرة أخرى ... لقد قمت الآن بتغيير بناء الجملة للإشارة إلى أنك تقوم بالنقابات والتقاطعات. ولكن بعد ذلك:

if(userkey I ("shift" U "a")) {
    // pressed both "shift" and the "a" key.

لذا I يعني أخذ تقاطع المجموعتين ... لكن if ينفذ كتلة الكود في أي ظروف؟ إذا كان التقاطع غير فارغ؟ أو I في الواقع يسأل "هل جميع أعضاء المجموعة على الأعضاء المناسبين من المجموعة على اليسار" وهناك تلميحات ذلك userkey يتم استبداله في نطاق الكتلة بقيمة أخرى والتي في الواقع فقط على اليمين.

أنا ذاهب إلى الفراش.

يمكن أن تستخدم أمثلةك ورياضياتك بعض الأعمال ، ولكن في أحد الأمثلة على الأقل على مدونتك ، استخدامك لـ | يشبه عن كثب استخدام نفس المشغل (يسمى "التناوب" ، على ما أعتقد) في لغة برمجة الأيقونة.

إذا كنت سترتكب تصميم اللغة في هذا المجال ، فيجب عليك بالتأكيد أن تقرأ عنها

C# بالتأكيد لا يحتوي على الميزات التي تصفها. يبدو أن ما تتحدث عنه يذكرنا إلى حد ما بتكامل روبن ميلنر PI ؛ الأمر كله يتعلق بتحديد لغة لوصف العمليات المتزامنة. قد تفكر في إجراء بعض الأبحاث في ذلك إذا لم تقم بذلك بالفعل.

ميزة لغتك تشبه تقاطعات في بيرل 6.

في بيرل 5 ، هناك الكم :: تراكب وحدة.

يجب أن تكون قد اخترعت الرموز الخاصة بك ، حتى للمثال فقط.

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

هل يمكن أن تشرح السياق الذي يقود هذه الطريقة غير العادية؟ لم يكن رابط مدونتك مفيدًا جدًا. ومصطلح "البرمجة المستمرة" غير محدد أو شرح ، إما.

تحديث:

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

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

بيثون وروبي لديهم أ yield آلية متشابهة للغاية وتتأثر بمولدات أيقونة.

أنصحك بعدم إضافة ميزة اللغة هذه. سيكون من غير الواضح جدًا للمبرمج أن معنى X يتغير إذا قمت بـ "اختبار" مثل:

if( x != a ) { ... }

لدى لغة الإبلاغ إذا كانت هناك هذه الميزة. من DM:

if (alpha == 3 or 4) print "Scott";

لم يتم القبض عليه حقًا ، لأنه من الغريب بعض الشيء (عليك أن تربط كل منها or/| مشغل مع مالك معين ==/!= المقارنة) ، وفي لغات البرمجة النصية الحديثة ، من السهل استبدال شيء مثل:

if alpha in (3, 4):
    print 'Scott';

(مثال بيثون.)

يبدو أنك تتدفق حول العديد من الأفكار في وقت واحد:

  • بناء جملة قائمة حيث تفعل شيئًا مثل 5 | 6 | 7
  • استخدام المنتج الخارجي حيث كنت تكتب ::list:: + ::list::
  • تحديد معنى المساواة ، عدم المساواة ، المهمة ، إلخ. أي ذلك ::scalor:: == ::list:: تنفذ "عنصر" ، وهكذا

لست على دراية بميزة طبقة واحدة تجمع بين هذه الفكرة ، لكن ليس لدي خبرة واسعة حقًا ...

"مع" موجود في AS3:

private var _a:Number = 0.0;
public function get a():Number{
// Do stuff
    return _a;
}
public function set a(value:Number):void{
// Do stuff
    _a=value;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top