একটি চিহ্ন যা অ-কার্যকরী অবস্থানে থাকে একটি ভেরিয়েবলের নাম হিসাবে বিবেচনা করা হয়। ইন (function variable) functionফাংশন-পজিশনে রয়েছে (খোলার প্রথম বন্ধনী পরে) এবং variableনেই। যদি না স্পষ্টভাবে উদ্ধৃত ভেরিয়েবলগুলি তাদের মানগুলির সাথে প্রতিস্থাপন করা হয়।
আপনি যদি লিখতে থাকেন (boundp my-variable)তবে এর অর্থ হবে "প্রতীকটি যা ভেরিয়েবল my-variableহিসাবে আবদ্ধ ভেরিয়েবলের মানগুলিতে সংরক্ষণ করা হয় " এবং না "প্রতীকটি my-variableএকটি ভেরিয়েবল হিসাবে আবদ্ধ।
তাহলে bound-and-truepঅন্যরকম আচরণ কেন ?
এটি একটি ম্যাক্রো এবং সাধারণ (ফাংশন) মূল্যায়নের নিয়মগুলি এখানে প্রয়োগ হয় না, ম্যাক্রোগুলি তাদের যুক্তি মূল্যায়ন করা হয় কিনা এবং কখন তা নির্ধারণ করতে পারে। ম্যাক্রোগুলি আসলে যা করে তা হ'ল একরকম আর্গুমেন্টকে রূপান্তরিত করে ফলাফলকে একটি তালিকা হিসাবে ফিরিয়ে দেয়, যার পরে মূল্যায়ন করা হয়। রূপান্তর এবং চূড়ান্ত মূল্যায়ন বিভিন্ন সময়ে ঘটে ম্যাক্রো-এক্সপেনশন-সময় এবং মূল্যায়ন সময় বলে।
সংজ্ঞাটি bound-and-true-pদেখতে দেখতে এটির মতো:
(defmacro bound-and-true-p (var)
"Return the value of symbol VAR if it is bound, else nil."
`(and (boundp (quote ,var)) ,var))
এটি রিডার ম্যাক্রোগুলি ব্যবহার করে যা লিস্প ম্যাক্রো থেকে আলাদা (নীচের দিকে আরও)। এটি আরও জটিল না করার জন্য কোনও পাঠক ম্যাক্রোগুলি ব্যবহার না করা উচিত:
(defmacro bound-and-true-p (var)
"Return the value of symbol VAR if it is bound, else nil."
(list 'and (list 'boundp (list 'quote var)) var))
যদি লিখি
(bound-and-true-p my-variable)
এটি প্রথমে "অনুবাদ" is
(and (boundp 'my-variable) my-variable)
এবং তারপরে এটি nilযদি my-variableনা হয় তবে ফেরার মূল্যায়ন করা হয় boundpবা অন্যথায় এর মান my-variable(অবশ্যই কোনটিও হতে পারে nil)।
আপনি লক্ষ্য করেছেন যে সম্প্রসারণ হয়নি
(and (boundp (quote my-variable)) my-variable)
আমরা আশা করতে পারে হিসাবে। quoteএকটি বিশেষ ফর্ম, ম্যাক্রো বা ফাংশন নয়। ম্যাক্রোর মতো, বিশেষ ফর্মগুলি তাদের যুক্তি দিয়ে যা কিছু করতে পারে। এই বিশেষ বিশেষ ফর্মটি কেবল তার আর্গুমেন্টটি প্রতীকের পরিবর্তনশীল মানের পরিবর্তে এখানে প্রতীক দেয় returns প্রকৃতপক্ষে এই বিশেষ ফর্মের একমাত্র উদ্দেশ্য: মূল্যায়ন রোধ করা! ম্যাক্রোজরা নিজেরাই এটি করতে পারে না, তাদের এটি করার জন্য প্রয়োজন quote।
তাহলে কি হবে '? এটি একটি পাঠক ম্যাক্রো , যা উপরে উল্লিখিত হিসাবে লিস্প ম্যাক্রোর মতো নয় । কোড / ডেটা রুপান্তর করতে ম্যাক্রোগুলি ব্যবহার করা হয়, সেই পাঠ্যটি কোড / ডেটাতে রূপান্তর করতে পাঠ্য ম্যাক্রোগুলি আগে ব্যবহৃত হয়।
'something
জন্য একটি সংক্ষিপ্ত ফর্ম
(quote something)
`bound-and-true-pএছাড়াও এর বাস্তব সংজ্ঞা ব্যবহৃত একটি পাঠক ম্যাক্রো। যদি এটি একটি চিহ্ন হিসাবে উদ্ধৃত হয় যেমন `symbolএটি সমতুল্য 'symbol, তবে যখন কোনও তালিকাটি উদ্ধৃতি হিসাবে ব্যবহৃত হয় তখন `(foo bar ,baz)সেই রূপগুলির সাথে পৃথকভাবে আচরণ করে যা ,মূল্যায়ন করা হয়।
`(constant ,variable)
সমতুল্য
(list (quote constant) variable))
এই প্রশ্নটির উত্তর দেওয়া উচিত কেন অনাকাক্সিক্ষত প্রতীকগুলি কখনও কখনও মূল্যায়ন করা হয় (তাদের মানগুলির সাথে প্রতিস্থাপন করা হয়) এবং কখনও কখনও হয় না; ম্যাক্রোগুলি quoteকোনও চিহ্নকে মূল্যায়ন করা থেকে বিরত রাখতে ব্যবহার করতে পারে।
তবে bound-and-true-pম্যাক্রো থাকাকালীন কেন boundpনয়? আমাদের নির্ধারণ করতে সক্ষম হতে হবে যে নির্বিচারে চিহ্নগুলি, যা রান-টাইম অবধি জানা যায় না, প্রতীক হিসাবে আবদ্ধ কিনা। যদি boundpযুক্তিটি স্বয়ংক্রিয়ভাবে উদ্ধৃত হয় তবে এটি সম্ভব হবে না ।
bound-and-true-pএকটি পরিচিত ভেরিয়েবল সংজ্ঞায়িত হয়েছে কিনা তা নির্ধারণ করতে এবং যদি এর মান ব্যবহার করা হয় তবে তা ব্যবহৃত হয়। কোনও লাইব্রেরির তৃতীয় পক্ষের লাইব্রেরিতে option চ্ছিক নির্ভরতা থাকলে এটি দরকারী :
(defun foo-get-value ()
(or (bound-and-true-p bar-value)
;; we have to calculate the value ourselves
(our own inefficient or otherwise undesirable variant)))
bound-and-true-pএকটি ফাংশন হিসাবে সংজ্ঞায়িত করা যায় এবং যুক্তি উদ্ধৃত করা প্রয়োজন কিন্তু কারণ এটি ক্ষেত্রে যেখানে আপনি আপফ্রন্ট কি জানেন পরিবর্তনশীল আপনি একটি ম্যাক্রো যত্নশীল জন্য দেয়ার উদ্দেশ্যে করা টাইপ করতে থাকার থেকে আপনি সংরক্ষণ করতে ব্যবহার করা হয়েছিল '।
setqএর জন্য দাঁড়িয়েছেset quotedএবং মূলত এটি ছিল একটি ম্যাক্রো যা প্রসারিত হয়েছিল(set 'some-variable "less")। সাধারণভাবে, এলিস্প উদ্ধৃত বনাম আনকোটিড আর্গুমেন্ট সম্পর্কে মারাত্মকভাবে সামঞ্জস্যপূর্ণ নয়, তবে কোনও ক্রিয়াকলাপ (ম্যাক্রো নয়) যা মানের পরিবর্তে ভেরিয়েবলের সাথে ইন্টারঅ্যাক্ট করতে হবে তার যুক্তিটি উদ্ধৃত (setqএকটি বড় ব্যতিক্রম হওয়া) গ্রহণ করবে।