বাফারটির জন্য লেক্সিকাল-বাঁধাই সক্ষম করার সম্ভাব্য সমস্যাগুলি কী কী?


12

এই আলোচনার দ্বারা অনুপ্রাণিত হয় আভিধানিক-বাঁধাই বনাম আভিধানিক-দিনএই প্রশ্নের । হিসাবে আভিধানিক-বাঁধাই আপনি উপযোগী বন্ধ মানুষ আছে করার ক্ষমতা দেয় জাভাস্ক্রিপ্ট মত অন্যান্য ভাষায় ব্যবহার করা যেতে পারে কেন না আপনি এটা সমস্ত সক্ষমিত হবে সময়?

পুরানো ইমাসসেনের সাথে পিছনে সামঞ্জস্যতা ধরে নেওয়া কোনও উদ্বেগ নয় যে লিগ্যাসি কোড বাফারগুলিতে এটি সক্ষম করে রাখলে আপনার কী কী ক্ষতির সন্ধান করা উচিত?

উত্তর:


13

একটি প্রধান ফাঁদ যে জন্য বাঁধাই শব্দার্থবিদ্যা হয় অনির্ধারিত ভেরিয়েবল-অর্থাত ভেরিয়েবল সঙ্গে সংজ্ঞায়িত করা defvarএবং সাথে বন্ধুত্ব-পরিবর্তন lexical-bindingতা ছাড়া,: letবেঁধে সবকিছু পরিবর্তনশীল কিন্তু lexical-bindingসক্রিয় অনির্ধারিত ভেরিয়েবল আবদ্ধ হয় আভিধানিক , এবং এমনকি বর্তমান আভিধানিক সুযোগ সম্পূর্ণরূপে যদি অব্যবহৃত লুপ্ত ।

পুরানো কোড কখনও কখনও এটির উপর নির্ভর করে। ঐচ্ছিক বৈশিষ্ট্য জন্য কঠিন নির্ভরতা এড়াতে, এটির গতিশীল ভেরিয়েবল বাঁধে চাই ছাড়া সংশ্লিষ্ট গ্রন্থাগার প্রয়োজন বা পরিবর্তনশীল নিজেই ঘোষণা:

(let ((cook-eggs-enabled t))
  (cook-my-meal))

যদি রান্নার বৈশিষ্ট্যটি isচ্ছিক হয় তবে আমরা ব্যবহারকারীর উপর অপ্রয়োজনীয় নির্ভরতা জোর করতে চাই না, তাই আমরা ব্যবহার করি না (require 'cook)এবং পরিবর্তে cook-my-mealফাংশনটি অটোলয়েডিংয়ের উপর নির্ভর করি ।

এটি মানব পাঠকের পক্ষে স্পষ্ট যা cook-eggs-enabledস্থানীয় পরিবর্তনশীল নয়, তবে এটি cookএখানে গ্রন্থাগার থেকে কিছু গ্লোবাল গতিশীল পরিবর্তনশীল বোঝায় । lexical-bindingএই কোড ব্যতীত উদ্দেশ্য হিসাবে কাজ করে: cook-eggs-enabledগতিশীলভাবে আবদ্ধ, নির্ধারিত হোক বা না হোক।

সঙ্গে lexical-bindingঅবশ্য তা ভঙ্গ: cook-eggs-enabledএখন আবদ্ধ হয় আভিধানিক (এবং তারপর অপ্টিমাইজ দূরে, কারণ এটি ব্যবহার করা হয় না), তাই বিশ্বব্যাপী গতিশীল পরিবর্তনশীল cook-eggs-enabledহয় না কখনও এ সব স্পর্শ এবং এখনও nilসময় দ্বারা cook-my-mealবলা হয়, তাই আমরা এটি আশ্চর্যজনক কোন ডিম থাকবে না আমাদের খাবারে

ভাগ্যক্রমে, এই বিষয়গুলি স্পট করা খুব সহজ : বাইট সংকলক প্রাকৃতিকভাবে এখানে একটি অব্যবহৃত লেক্সিকাল বাইন্ডিং সম্পর্কে সতর্ক করে

ফিক্স সহজ: উভয় ক্ষেত্রেই যোগ একটি (require 'cook)(বৈশিষ্ট্য যে সত্যিই ঐচ্ছিক যাহাই হউক না কেন না তাদের জন্য), অথবা-টু হার্ড গতিশীল পরিবর্তনশীল হিসাবে পরিবর্তনশীল নির্ভরতা-ডিক্লেয়ার এড়াতে আপনার নিজের কোডে । এর জন্য একটি বিশেষ defvarফর্ম রয়েছে:

(defvar cook-eggs-enabled)

এটি cook-eggs-enabledগতিশীল পরিবর্তনশীল হিসাবে সংজ্ঞায়িত করে তবে ভেরিয়েবলের বাঁধার প্রকৃতি ব্যতীত ডক্ট্রিং, load-history(এবং এইভাবে find-variableএবং বন্ধুবান্ধব) বা অন্য কোনও কিছুকে প্রভাবিত করে না ।


গতিশীল ক্ষেত্রে, না যে কোড স্নিপেট কারণ হবে cook-eggs-enabledহতে আনবাউন্ড যখন letশেষ? আমি নিশ্চিত যে আমি এর আগে একটি বাগ এ চলেছি। ডিফভারটি অভ্যন্তরের অভ্যন্তরে ঘটছিল let, এবং letপরবর্তীকালে পরিবর্তনশীলটিকে তার প্রাথমিক (অকার্যকর) অবস্থায় পুনরুদ্ধার করে।
মালবারবা

1
@ মালাবাবা না, এটি একটি ভিন্ন পরিস্থিতি। কারণ হিসাবে ভেরিয়েবলগুলি সংজ্ঞায়নের শেষ অনুচ্ছেদটি দেখুন ।
লুনারিওর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.