`Setq-local` কী করে এবং কখন এটি ব্যবহার করা উচিত?


16

এসএক্সে এখানে সমস্ত ডক এবং পোস্টের একগুচ্ছ পড়ার পরেও আমি বাফার-লোকাল ভেরিয়েবলের সমস্ত প্রকারভেদগুলিতে পুরোপুরি পরিষ্কার নই।

আমার বোঝার সংক্ষিপ্তসার এখানে:

(defvar foo ..)ফাইলের জন্য একটি গতিশীল পরিবর্তনশীল ঘোষণা করে। তবে ভেরিয়েবলটি (1) অন্য ফাইলগুলির সাথে পরিচিত না হয় যতক্ষণ না defvar সেগুলিতে পাশাপাশি একটি বিবৃতি অন্তর্ভুক্ত করা হয় এবং (2) ভেরিয়েবল স্থানীয়ভাবে নয়, স্কোপের ক্ষেত্রে বিশ্বব্যাপী।

(make-variable-buffer-local foo)defvarউপরের অংশটি সংকলক এবং অন্য সবাইকে বলার পরে যে ভেরিয়েবল foo সেট করা থাকে সেদিকেই এটি যে কোনও জায়গায় বাফার-লোকাল হিসাবে বিবেচনা করা উচিত। সুতরাং এই প্যাটার্নটি একটি বাফার-লোকাল ভেরিয়েবল ডিক্লেয়ারের জন্য ভাল স্টাইল, উভয় স্টেটমেন্টকে ফাইলের পিছনে পিছনে রাখবে।

(defvar xxx ...)                    ;declare xxx with global scope
(make-variable-buffer-local 'xxx)   ;but now make it buffer-local everywhere

সুবিধার্থে, (defvar-local xxx ...)ফর্মটি উপরের দুটি লাইনের জায়গায় এক লাইন হিসাবে ব্যবহার করা যেতে পারে:

(defvar-local xxx ...)       ;make xxx buffer local everywhere

উপরের মত ঘোষিত হয়ে গেলে, ভেরিয়েবল এক্সএক্সএক্স সেটেক স্টেটমেন্টে অন্য কোনও ভেরিয়েবলের মতো ব্যবহার করা যেতে পারে।

যদি আমি কেবল বাফার-লোকাল ভেরিয়েবলের একক উদাহরণ পেতে চাই যা ইতিমধ্যে একটি গ্লোবাল ডায়নামিক ভেরিয়েবল, আমি নীচের ঘোষণাগুলি ব্যবহার করব use প্রথমটি গ্লোবাল-স্কোপ ডায়নামিক ভেরিয়েবল ঘোষণা করে এবং দ্বিতীয় বিবৃতিটি বর্তমান বাফারে সেই পরিবর্তনশীলটির একটি বাফার-স্থানীয় সংস্করণের মাত্র একটি উদাহরণ তৈরি করে:

(defvar xxx ...)             ;declare xxx with global scope
(make-local-variable 'xxx)   ;make xxx local in this buffer only

এখন আমার স্পষ্টবাদী প্রশ্নের জন্য (উপরের সমস্তটি আমার বোঝাটি সঠিক কিনা তা নিয়ে অন্তর্ভুক্ত প্রশ্নগুলি ছিল)।

ভেরিয়েবলের মান সেট করার সময়, আমি setqবা ব্যবহার করতে পারি setq-local। কখন setq-localব্যবহার করা উচিত ? কেন?

আমি যদি setq-localবাফার-লোকাল ওয়ার্স, বা নন-বাফার-লোকাল ভার্সে ব্যবহার করি তবে কী হবে ?

হয় setq-localএকটি জন্য প্রয়োজন বোধ করা defvar-localঘোষিত পরিবর্তনশীল?

হবে setq-localএকটি স্বাভাবিক উপর defvarঘোষিত পরিবর্তনশীল একটি বাফার-স্থানীয় পরিবর্তনশীল সেটিকে পালা? (অন্য কথায়, setq-localকোনওভাবে কোনও (make-variable-local xxx)ঘোষণার সমতুল্য ?


অতিরিক্ত শ্রম স্কট জন্য ধন্যবাদ। আমি এখান থেকে অতিরিক্ত ব্যাককোটিস পরে দেব
কেভিন

2
(setq-local VAR VALUE)কেবল শর্টহ্যান্ডের জন্য (set (make-local-variable VAR) VALUE), যা ছিল একটি সাধারণ প্রতিমা।
ড্রিউ

উত্তর:


18

আপনার বেশিরভাগ অনুমান কাছাকাছি। আমি কিছু পরে উল্লেখ করব। তবে, প্রথমে মূল প্রশ্ন।

ফর্মটি setq-localকেবল একটি সুবিধা, এটি make-local-variableঅনুসরণ করার মতোই setq। আপনি যদি C-h f setq-localডকুমেন্টেশনটি দেখতে কোনও কাজ করে থাকেন এবং উত্সটিতে ক্লিক করেছেন তবে আপনি এটি দেখে থাকতে পারেন। এইভাবে আমি আমার প্রথম ছাপটি যাচাই করেছি। কোডটি কিছুটা অস্পষ্ট, যদিও যেহেতু এটি বাস্তবে make-local-variableপরিবর্তনশীল নিজেই ফিরিয়ে দেয় এমন বিষয়গুলিকে অনুকূল করে তুলছে । setq-localকিছু কোডের স্থানীয়তা চিহ্নিত করার উপায়টি ব্যবহার করা, যাতে অন্যরা জানতে পারে যে কোডটি ভেরিয়েবলের গ্লোবাল মান দিয়ে খেলছে না। আপনাকে যা না স্থানীয় ভেরিয়েবল অ্যাক্সেস করার জন্য এটি ব্যবহার করতে হবে। যে কোনও ভেরিয়েবলটি বাফার-লোকাল করা যায় এবং এটি ভেরিয়েবলের সাথে স্পর্শ করা সমস্ত কোডকে প্রভাবিত করে (যদি এটি বৈশ্বিক অনুলিপিটির সাথে setq-defaultবা এর অনুরূপ পাওয়ার বাইরে চলে যায় ) তবে।

এটাই প্রাথমিক উত্তর। এখন, আপনার ব্যাকগ্রাউন্ডে কিছু জিনিস রয়েছে যা কিছুটা বন্ধ। যেহেতু আপনি এটি সম্পর্কে জিজ্ঞাসা করেছেন, আমি কিছু বিষয় সম্বোধন করব।

প্রথমটি "অন্যান্য ফাইলগুলির জন্য পরিচিত নয়"। এটা আসলে সত্য নয়। যে কোনও কোড যেকোনও বৈশ্বিক চলককে উল্লেখ করতে পারে (এজন্য এগুলিকে "গ্লোবাল" বলা হয়) অন্তর্ভুক্ত না করে defvar(এবং C-h f defvarতাই বলে)। প্রকৃতপক্ষে, প্রতিটি বিশ্বব্যাপী ভেরিয়েবলের জন্য কেবল একটি প্রধান defvar(ডকাস্ট্রিং এবং ডিফল্ট মান সহ) থাকতে হবে। একটি defvarমাত্র পরিবর্তনশীল নামের সঙ্গে একটি বাইট-কম্পাইলার সতর্কবার্তা দমন করতে ব্যবহার করা যাবে। ইমাকস কেবল এটির প্রথমটি দেখায় from এবং শেষটি থেকে ডক্ট্রিং ব্যবহার করে uses defvarমান / ডকস্ট্রিং সহ যদি একাধিক গুলি থাকে তবে তারা কোডটি পড়ে লোকদের বিভ্রান্ত করতে পারে। এবং ফাইলগুলি লোড করার ক্রমটি বিবেচনা করবে।

কিছু ভেরিয়েবল কেবল বাফার-লোকাল হিসাবে ব্যবহার করার উদ্দেশ্যে এবং সেগুলিই ব্যবহার করে defvar-local(বা দুটি অংশ defvar/ make-variable-buffer-localযার জন্য এটি সংক্ষিপ্ত, বেশিরভাগ সংক্ষিপ্ত ফর্ম যুক্ত হওয়ার আগে পুরানো কোডে)। এটি এটি সমস্ত বাফারগুলিতে বাফার-স্থানীয় হতে পারে। কিছু ভেরিয়েবলের জন্য, তাদের প্রাথমিক ব্যবহার বাফার-স্থানীয় নয়, তবে কোনও কারণে আপনি একটি বাফারের আলাদা মান রাখতে চাইতে পারেন। আপনি যখন কিছু ব্যবহার করেন তখন make-local-variableসাধারণত কোনও বাফার সেটআপ কোড এ ঠিক পরে আসে না defvar

এবং একটি সাধারণ জিনিস হিসাবে, defvarফর্ম দুটি উদ্দেশ্য আছে । একটিতে কিছু ডকুমেন্টেশন থাকা দরকার, যাতে C-h vভেরিয়েবলটি কী তা অন্যরা তা জানতে ব্যবহার করতে পারেন। দ্বিতীয়টি হল একটি "ডিফল্ট" মান ঘোষণা করা, যাতে চলক সর্বদা সেট থাকে। ডিফল্ট মানের ঘোষণাটি কেবলমাত্র একটি ভেরিয়েবলের বৈশ্বিক (বা ডিফল্ট) দৃষ্টিকোণকে প্রভাবিত করে এবং কেবলমাত্র যদি উদাহরণটি ইতিমধ্যে কিছুতে সেট না করা হয় তবে এটি ব্যবহৃত হয়। এর অর্থ হ'ল যদি আপনি setqকিছু পরিবর্তনশীল হন এবং তারপরে ফাইলটি অন্তর্ভুক্ত করেন defvar(উদাহরণস্বরূপ এ এর ​​মাধ্যমে require), ডিফভার মান পরিবর্তন করে না।

¹ আরও স্পষ্টভাবে, defvarভেরিয়েবলের মানটি ইতিমধ্যে সেট করা থাকলে তা পরিবর্তন করে না (এটি তবে ডকাস্ট্রিং সেট করে); এটি এর অর্থ (setq some-variable)হ'ল প্যাকেজের ডিফল্ট মানটি ওভাররাইড করার জন্য কোনও প্যাকেজ লোড হওয়ার আগে ব্যবহারকারীর init ফাইলটি করতে পারে ।


1
খুব সুস্পষ্ট উত্তরের জন্য ধন্যবাদ, এটি অনেক সাহায্য করে। আমি যখন "অন্যান্য ফাইলগুলিতে পরিচিত নই" এই বাক্যাংশটি ব্যবহার করি তখন আমি ফ্রি ভেরিয়েবল সতর্কতাগুলির কথা ভাবছিলাম কারণ অন্য ফাইলগুলি ভেরিয়েবলটি মুক্ত বলে মনে করবে যদি না আমি তাদের মধ্যে একটি ডিভভার যোগ না করি। আমি আপনার বক্তব্যটি পছন্দ করি যা set-localপাঠকদের জানায় যে একটি স্থানীয় ভের সেট করা হচ্ছে। আমার কোডের পাঠযোগ্যতার উন্নতি করতে আমি যা কিছু করতে পারি তা ভাল! পুনশ্চ. আমি উত্স থেকে আরও প্রায়শই ক্লিক করার চেষ্টা করব; আমার বর্তমান বিকাশের স্তরে, এটি প্রায়শই শব্দার্থবিজ্ঞানে আসে না ... :-)
কেভিন

1
" defvarপ্রতিটি বৈশ্বিক পরিবর্তনশীলের জন্য কেবল সেখানে একটি হওয়া উচিত " কঠোরভাবে সঠিক নয় - এমন পরিস্থিতি রয়েছে যখন (defvar VARNAME) কোনও VARNAME- এর সঠিক সংজ্ঞা (প্রাথমিক মান এবং আদর্শভাবে একটি ডক্টস্ট্রিং সহ) স্বাধীনভাবে কোনও মান ছাড়াই ঘোষণা করা উচিত।
ফিলি

2
এছাড়াও মনে রাখবেন setq-localএবং defvar-localশুধুমাত্র এ গিয়ে Emacs 24.3 ব্যবস্থা চালু হয়েছে।
ফিল্ড

1
@ ফিলস, আপনি দয়া করে আপনি যে পরিস্থিতিগুলির কথা বলছেন তা চিহ্নিত করতে পারেন, মান ছাড়াই কোথায় (defvar varname)ঘোষণা করা উচিত ? আমি যখন অন্য কোথাও ঘোষিত গ্লোবালগুলির জন্য আমার ফাইলগুলিতে ফ্রি ভেরিয়েবল সতর্কতা থেকে কীভাবে মুক্তি পাব তা জিজ্ঞাসা করছিলাম যখন আমি ড্রয়াকে অন্য থ্রেডের পরামর্শ দিয়েছিলাম বলে আমি ভাবছি। আমি এখন এটি। আপনি কি সেই পরিস্থিতিটির কথা বলছেন?
কেভিন

1
বাইট-সংকলন সতর্কতা এড়ানো একটি কারণ, হ্যাঁ (দেখুন C-h i g (elisp) Warning Tips)। অন্যটি লেক্সিকাল-বাইন্ডিং ব্যবহার করে গ্রন্থাগারগুলির জন্য (যদি প্রয়োজন হয়) তা নিশ্চিত করতে যে চলকটি লেক্সিক্যালি সীমাবদ্ধ না হয়ে গতিশীলভাবে আবদ্ধ হয়।
ফিল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.