غريب Tcl quirk
-
30-09-2019 - |
سؤال
لذلك أنا جديد للغاية وعديم الخبرة في طرق برمجة TCL. لقد كتبت نصًا يدعو PROC الذي كتبه شخص آخر ، وإزالة ملف الإخراج أولاً. ثم يقوم ببعض المنطق الإضافي الذي كتبته.
لقد انتقلت المنطق إلى بروك الثاني وعلى الفور اندلعت حفنة منه (وهي أوامر RM).
من ما يمكنني قوله ، يتم تنفيذ البرنامج الأول على سطر داخل التنفيذ المركزي (النص التالي تعريف PROC) بشكل طبيعي بدون أمر "exec". ومع ذلك ، إذا قمت بنقله داخل Proc ، فإنه يحتاج الآن إلى أمر "exec".
هل يمكن لأي شخص أن يشرح لي لماذا يتصرف TCL بهذه الطريقة؟
على سبيل المثال
proc helloworld {} {
puts "hi"
}
#works
rm my_file
helloworld
..
proc helloworld {} {
#doesn't work
rm my_file
puts "hi"
}
helloworld
..
proc helloworld {} {
#works
eval rm my_file
puts "hi"
}
helloworld
..
proc helloworld {} {
#works
file delete my_file
puts "hi"
}
helloworld
*لاحظ أن هذا السلوك الغريب قد يكون خاصًا بالبرنامج الذي أقوم بتغذية البرنامج النصي إلى VMD ، والذي يحتوي على سلوك TCL الخاص به. ربما في ردودك ، يمكنك الإشارة إلى ما إذا كان هذا معيارًا لمترجمين الفوريين الآخرين أيضًا؟
المحلول
و تفاعلي ستحاول جلسة TCLSH exec
أمر غير معروف (مثل rm
). لا يمكنك الاعتماد على هذا السلوك في تنفيذ البرنامج النصي غير التفاعلي أو ، كما اكتشفت ، في Procs.
لا أستطيع أن أرى أن هذا موثق في tclsh صفحة الرجل ، ولكن مجهول صفحة الرجل تفعل. انظر أيضا tclsh صفحة على tcl wiki. في جلسة TCLSH التفاعلية ، يمكنك معرفة ماذا unknown
يفعل عن طريق الكتابة:
info body unknown
تحديث
نقلاً عن "البرمجة العملية في TCL و TK":
ال
unknown
يوفر الأمر بعض وسائل الراحة الأخرى. يتم استخدام هذه فقط عند كتابة الأوامر مباشرة. يتم تعطيلها بمجرد دخول التنفيذ إلى إجراء أو إذا لم يتم استخدام قذيفة TCL بشكل تفاعلي. ميزات الراحة هي التنفيذ التلقائي للبرامج وسجل القيادة واختصار القيادة. تتم محاكمة هذه الخيارات ، إذا لم يتم تحميل تنفيذ الأوامر من مكتبة نصية.
نصائح أخرى
لاحظ أن هذا يمكن اختباره برمجيًا أيضًا ، عبر المتغير TCL_INTACTIVE, ، وهو "1" إذا تم تشغيل TCL عبر قذيفة تفاعلية ، و "0" إن لم يكن. المتغير قابل للتسوية أيضًا ، لذلك يمكن للمرء أن يبدأ قذيفة تفاعلية ، ثم اضبط TCL_INTECTACTION 0, ، والاستمرار. في هذه المرحلة ، يفقد المرء ميزات مثل