سؤال

هل هناك طريقة ل(أ ب) استخدام تى سى ال C-API إلى "تحليل" سلسلة، القيام بجميع استبدال (بما في ذلك الأوامر الفرعية بين قوسين معقوفين)، ولكن وقف قبل أن يقيم في الواقع سطر الأوامر الناتجة؟

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

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

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

وأنا شيء مفقود؟

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

المحلول

ونلقي نظرة على Tcl_SubstObj . انها معادلة C من [SUBST] الأوامر، والتي يبدو أن ما كنت أبحث عنه.

وكما أشرت في تعليقك، SUBST لا تفعل تماما ما كنت تبحث القيام به. إذا كان يساعد، قد يكون رمز تى سى ال التالية ما كنت تبحث عن:

> set mydata {mylist item $listitem group item {$group item}}
> set listitem {1 2 3}
> subst $mydata      ;# error: can't read "group": no such variable
> proc groupsubst {data} {
    return [uplevel 1 list $data]
}
> groupsubst $mydata ;# mylist item {1 2 3} group item {$group item}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top