كيف يمكنني الكشف عن التعميم المنطق أو العودية في العرف التعبير المشخص ؟

StackOverflow https://stackoverflow.com/questions/322089

  •  11-07-2019
  •  | 
  •  

سؤال

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

على سبيل المثال:

pi = 3.14159
rad = 5
area = pi * rad * rad
perim = 2 * pi * rad

أنا تعريف 'بي' و 'راد' كما متغيرات (حسنا, وظائف عائد ثابت) ، 'المنطقة' و 'perim' كما الوظائف.أي وقت إما 'بي' أو 'راد' تغيير أتوقع نتائج 'المنطقة' و 'perim' إلى تغيير في نوع.وبالمثل ، إذا كانت هناك أي وظائف اعتمادا على 'المنطقة' أو 'perim', نتائج تلك لن تتغير كذلك.

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

على سبيل المثال:

a = b
b = c
c = a

الآن تقييم السطر الأخير النتائج في StackOverflowException (بينما أول سطرين تقييم '0' - متغير غير معرف/وظيفة يساوي 0).ما أود القيام به هو الكشف عن التعميم المنطق الوضع لا سمح للمستخدم بادخال نص هذا البيان.أريد أن أفعل هذا بغض النظر عن مدى عمق دائرية المنطق هو مخفي, ولكن ليس لدي أي فكرة عن كيفية القيام بذلك.

وراء الكواليس ، بالمناسبة ، الإدخال سلاسل يتم تحويلها إلى الرموز عبر ماسح ضوئي بسيط ، ثم إلى جملة مجردة شجرة عبر الخطي العودية النسب محلل ، ثم AST يتم تقييمها.اللغة C#, ولكن أنا لا أبحث عن حل الشفرة - المنطق وحده سوف يكون على ما يرام.

ملاحظة:هذا هو مشروع شخصي أنا باستخدام لمعرفة كيف موزعي و القائمون على العمل, حتى انها ليست مهمة - ولكن المعرفة لا يسلب من هذا أنا لا تخطط لوضع العمل في الحياة الحقيقية في بعض نقطة.أي مساعدة يا رفاق يمكن أن توفر سيكون موضع تقدير كبير.=)

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

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

المحلول

كان عندي مشكلة مشابهة لهذه في الماضي.الحل كان لدفع أسماء المتغيرات على كومة وأنا recursed من خلال تعبيرات التحقق من بناء الجملة, والبوب لهم كما خرجت العودية المستوى.

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

تحرير:هذا بالطبع واحد الصيغ...بالنسبة لمشكلتك, دوري الرسم البياني متغير المهام من شأنه أن يكون أفضل وسيلة للذهاب.

نصائح أخرى

الحل (ربما أفضل) هو خلق تبعية الرسم البياني.

في كل مرة وظيفة إضافة أو تغيير التبعية البياني يتم التحقق cylces.

وهذا يمكن أن تكون قصيرة.في كل مرة وظيفة إضافة أو تغيير العلم في ذلك.إذا كانت نتائج التقييم في استدعاء دالة التي يتم وضع علامة لديك دورة.

على سبيل المثال:

a = b

  • العلم
  • eval ب (لا وجدت)
  • unflag a

b = c

  • العلم ب
  • eval ج (لا وجدت)
  • unflag ب

c = a

  • العلم ج
  • eval a
  • eval ب
  • eval ج (وضع علامة) -> دورة تجاهل التغيير c!
  • unflag ج

في الرد على تعليق على الجواب الثاني:

و(عذرا، مجرد عابث تصل رسالتي خلق هوية OpenID ذلك سآخذ للحصول على الاشياء القديمة ربط في وقت لاحق ...)

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

وأندرو

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top