একটি চিহ্ন যা অ-কার্যকরী অবস্থানে থাকে একটি ভেরিয়েবলের নাম হিসাবে বিবেচনা করা হয়। ইন (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
একটি বড় ব্যতিক্রম হওয়া) গ্রহণ করবে।