পরিবর্তনশীল নামের আগে একক উদ্ধৃতি কখন এবং কখন ব্যবহার করবেন না তা কীভাবে জানবেন?


31

আমার নীচে আছে:

(setq some-variable "less")

কেন আমি একক উক্তিটি ব্যবহার করতে চাইছি boundpতা দিয়ে নয় তবে আমি বিভ্রান্ত bound-and-true-p

উদাহরণ 1:

(when (boundp 'some-variable) 
   (message "some-variable is %s" some-variable))

ফলাফল:

"কিছু পরিবর্তনশীল কম"

উদাহরণ 2a:

(when (bound-and-true-p some-variable) ;; Note that using single-quote causes error
   (message "some-variable is %s" some-variable))

ফলাফল:

"কিছু পরিবর্তনশীল কম"

উদাহরণ 2 বি:

(when (bound-and-true-p 'some-variable) ;; Note that using single-quote causes error
   (message "some-variable is %s" some-variable))

ফলাফল:

এবং: ভুল ধরণের আর্গুমেন্ট: প্রতীক, (কিছু পরিবর্তনশীল উদ্ধৃতি)


5
এটি উল্লেখযোগ্য যে setqএর জন্য দাঁড়িয়েছে set quotedএবং মূলত এটি ছিল একটি ম্যাক্রো যা প্রসারিত হয়েছিল (set 'some-variable "less")। সাধারণভাবে, এলিস্প উদ্ধৃত বনাম আনকোটিড আর্গুমেন্ট সম্পর্কে মারাত্মকভাবে সামঞ্জস্যপূর্ণ নয়, তবে কোনও ক্রিয়াকলাপ (ম্যাক্রো নয়) যা মানের পরিবর্তে ভেরিয়েবলের সাথে ইন্টারঅ্যাক্ট করতে হবে তার যুক্তিটি উদ্ধৃত ( setqএকটি বড় ব্যতিক্রম হওয়া) গ্রহণ করবে।
shosti

2
FWIW, bound-and-true-pএকটি বোকা ম্যাক্রো। বা বরং এটির নাম বোকা। সময় 99.99% যখন আপনি কি করতে চান (and (boundp 'FOO) FOO)আপনাকে এটা করতে এর মান ব্যবহারFOO । আপনি কেবল সত্যের মূল্য পেতে এটি করবেন না। (1) ম্যাক্রোর প্রয়োজন হয় না - কোডটি এটি প্রতিস্থাপন করে তোলে তুচ্ছ এবং ছোট। (২) নামটি বিভ্রান্তিকর - এটি পরিবর্তনশীল মান সম্পর্কে, কেবল ভেরিয়েবল মানটি কিনা তা পরীক্ষা করে নয় nil
অঙ্কিত

উত্তর:


24

সংক্ষিপ্ত উত্তর

আপনি যদি ভেরিয়েবলটি নিজেই ব্যবহার করার চেষ্টা করছেন তবে ব্যবহার করুন 'some-variable। আপনি যদি ভেরিয়েবলের মধ্যে সঞ্চিত মানটি ব্যবহার করার চেষ্টা করছেন তবে ব্যবহার করুন some-variable

  • বাউন্ডপ প্রতীক ব্যবহার করে তাই এটি ফাংশন সহ আবদ্ধ হতে পারে এমন কোনও কিছুর দিকে নজর দেবে। এটি কেবল মূল্যবোধের সাথে মিল রেখে প্রতীক মিলছে কিনা তা যত্নশীল care
  • সীমাবদ্ধ এবং ট্রুপ বিভিন্ন ব্যবহার করে এবং মানটি দেয়। এই ক্ষেত্রে আপনাকে ফাংশনে প্রতীকটির মান সরবরাহ করতে হবে। যদি কোনও চিহ্নের ভার আবদ্ধ না হয় বা মান শূন্য হয় তবে তা শূন্য হবে।

ব্যাখ্যা

ম্যানুয়াল সংজ্ঞা জন্য ম্যানুয়াল দেখুন

'এবং (quote ...)উভয়ই ইমাস-লিস্পে একই উদ্দেশ্য সম্পাদন করে।

এর উদ্দেশ্য হ'ল অমূল্য ফর্মটিকে মূল্যায়ন না করে পার্শ্ববর্তী পরিবেশে পৌঁছে দেওয়া।

আপনার উদাহরণ হিসাবে ধরে নিন আমাদের নীচেরগুলি উচ্চতর ছিল

(setq some-variable "less") ;; Rather than just 't for clarity

তারপরে মূল্যায়নটি নীচে চলে:

(when (boundp 'some-variable) 
   (message "some-variable is %s" some-variable))
;; ==> (boundp 'some-variable) ; 't
;; ==> some-variable is "less"

যেখানে কোনও উদ্ধৃতি ছাড়াই:

(when (boundp some-variable) ;; Note that using single-quote causes error
   (message "some-variable is %s" some-variable))
;; ==> (boundp "less") ; "less" is not a variable. -> Error

লিস্প ফর্মগুলি পৌঁছে যাওয়ার সাথে সাথে তার মূল্যায়ন করে, আপনি যে ফর্মটি মূল্যায়ন প্রতিরোধ করেন যাতে প্রকৃত পরিবর্তনশীল (বা তালিকা বা ফাংশন নাম) পাস হয়।


ধন্যবাদ! আপনার উত্তর আমাকে উভয়ের উত্সগুলিতে ঝাঁপিয়েছে এবং সমাধানটি সামনে আসতে সহায়তা করেছে। আমি স্পষ্ট উদাহরণ সহ আমার প্রশ্ন আপডেট।
দক্ষ মোদী

6
আমি আনন্দিত যে এটি অপটিকে সাহায্য করেছে, তবে এটি আসলে প্রশ্নের উত্তর দেয় না (অন্যভাবে একই প্রশ্নযুক্ত লোকদের জন্য দরকারী)। আপনি কেবল ব্যাখ্যা করেছেন যে প্রতীকগুলি উদ্ধৃত করতে হবে অন্যথায় সেগুলি মূল্যায়ন করা হবে। আপনি কেন ব্যাখ্যা করেন না যে কেন এটি ক্ষেত্রে নয় bound-and-truepএবং প্রশ্নটি ছিল কেন আমাকে যখন ব্যবহার করার সময় উদ্ধৃত করতে হবে boundpতবে ব্যবহার করার সময় নয় bound-and-truep
তারসিয়াস

@ টারসিয়াস আমি আসলে boundpএকটি চিহ্নের প্রয়োজন (মূল্যহীন) এবং bound-and-truepবুলেট পয়েন্টগুলিতে (প্রাথমিক উত্তর পরে সম্পাদিত) ভেরিয়েবলের মান প্রয়োজনের মধ্যে পার্থক্য অন্তর্ভুক্ত করি
জোনাথন লিচ-পেপিন

আমি মনে করি যে এটি কেন তাই (ম্যাক্রোগুলি মূল্যায়ন না করা বেছে নিতে পারে) উল্লেখ করার পরিবর্তে এটি ডক স্ট্রিংয়ের কথাই উল্লেখ করার পরিবর্তে প্রয়োজনীয়। আমি মনে করি এটি একটি খুব ভাল প্রশ্ন এবং এটি বাউন্ড্প বনাম সীমাবদ্ধ এবং সত্য-পি কেবল উদাহরণ। প্রশ্নটি আসলে কী উত্সাহিত করে তা হল মূল্যায়নের নিয়মগুলি সম্পর্কে জানার ইচ্ছা desire
তারসিয়াস

@ টারসিয়াস এই উত্তর দ্বারা মূল্যায়ন বিধি ব্যাখ্যা করা হয় না? কমপক্ষে কেবলমাত্র উক্তিটির সাথে জড়িত বেসিকগুলি ... আপনার উত্তর অবশ্যই আরও সম্পূর্ণ, তবে এটি বিষয়টির বাইরে চলে গেছে, তাই না?
টি ভেরন

16

একটি চিহ্ন যা অ-কার্যকরী অবস্থানে থাকে একটি ভেরিয়েবলের নাম হিসাবে বিবেচনা করা হয়। ইন (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একটি ফাংশন হিসাবে সংজ্ঞায়িত করা যায় এবং যুক্তি উদ্ধৃত করা প্রয়োজন কিন্তু কারণ এটি ক্ষেত্রে যেখানে আপনি আপফ্রন্ট কি জানেন পরিবর্তনশীল আপনি একটি ম্যাক্রো যত্নশীল জন্য দেয়ার উদ্দেশ্যে করা টাইপ করতে থাকার থেকে আপনি সংরক্ষণ করতে ব্যবহার করা হয়েছিল '


আশ্চর্যরূপে ভাল উত্তর।
চার্লস রিচি

2

এর উত্স কোড থেকে boundp:

DEFUN ("boundp", Fboundp, Sboundp, 1, 1, 0,
      doc: /* Return t if SYMBOL's value is not void.
Note that if `lexical-binding' is in effect, this refers to the
global value outside of any lexical scope.  */)

boundpsymbolইনপুট হিসাবে একটি আশা করে 'some-variableপরিবর্তনশীল একটি প্রতীক some-variable

এর উত্স কোড থেকে 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))

bound-and-true-pvariableইনপুট হিসাবে একটি আশা করে

bound-and-true-pম্যাক্রোর ভিতরে এটি করে প্রতীক পায় (quote ,var)। সুতরাং ইনপুট যদি হয় some-variable, (quote ,var)ফলাফল হবে 'some-variable

কিন্তু আমি যখন ইনপুট দিতে 'some-variableকরার bound-and-true-p, আমি ভুল পান: and: Wrong type argument: symbolp, (quote some-variable)কারণ ম্যাক্রো প্রতীক (প্রত্যাশা না করা হয় 'some-variable) ইনপুট করেন।


শুধু একটি মাথা আপ. ''symbol না জানার। এর অর্থ (quote (quote symbol))। আপনি কোনও ত্রুটি পাওয়ার কারণ এটি হ'ল এটি বৈধ যুক্তি নয় boundp
মালবারবা

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