ল্যাম্বডায় জেনারেটড ডক স্ট্রিং যুক্ত করা কি সম্ভব?


10

ইমাস ডক্স বলছে যে যখন ডকের স্ট্রিংটি ভিতরে রাখা হয় lambdaবা defunএটি "ফাংশন অবজেক্টে সরাসরি সঞ্চিত থাকে"। যাইহোক, আমরা নামযুক্ত ফাংশনগুলির ডকগুলি এর মতো পরিবর্তন করতে পারি:

(put 'my-function-name 'function-documentation "Blah.")

তবে একই কৌশল ল্যাম্বডাসের সাথে কাজ করে না। লাম্বডায় ডকুমেন্টেশন যুক্ত করার কোনও উপায় আছে? বা কোনওভাবে ডায়নামিকভাবে ডক স্ট্রিং আক্ষরিক উত্পন্ন করে?

স্পষ্ট করতে, নিম্নলিখিত পরিস্থিতিটি কল্পনা করুন:

(let ((foo 1)
      (bar 2))
  (lambda ()
    (+ foo bar)))

আমি ল্যামডা পছন্দের ডক স্ট্রিংটি মান উল্লেখ আছে হবে fooএবং bar

উত্তর:


12

ওয়েল ল্যাম্বডাসের অন্যান্য ফাংশন সংজ্ঞার মতো নিয়মিত ডকস্ট্রিং থাকতে পারে:

(lambda ()
   "I'm a docstring!"
   (+ foo bar))

সুতরাং আপনি ব্যবহার করতে পারেন:

(let ((foo 1)
      (bar 2))
  `(lambda ()
     ,(format "Function which sums foo=%s and bar=%s" foo bar)
     (+ foo bar)))

আপনি কেন কোনও বেনামি ফাংশনে ডক্ট্রিং চান তা অন্য প্রশ্ন, যা আপনার গ্রহণ করা পদ্ধতির উপর প্রভাব ফেলতে পারে।

উদাহরণস্বরূপ, আপনি যদি এটি কোনও কী-তে আবদ্ধ করার পরিকল্পনা করে থাকেন এবং আপনি C-h kসেই সহায়তা প্রদর্শন করতে চান তবে আপনি এই পদ্ধতির ব্যবহার করতে পারেন, তবে অবশ্যই সহায়তাটি ফাংশন অবজেক্টটি নিজেই প্রদর্শন করবে (ডাস্ট্রিং অন্তর্ভুক্ত), যা তাই নয় মহান; তবুও আপনি এই কাজ করতে পারে এবং আপনি হবে (উপরন্তু) চমত্কারভাবে বিন্যস্ত সংস্করণ দেখুন:

(global-set-key
 (kbd "C-c a")
 (let ((foo 1)
       (bar 2))
   `(lambda ()
      ,(format "Function which sums foo=%s and bar=%s" foo bar)
      (interactive)
      (+ foo bar))))

তবে আপনি প্রতীক ব্যবহার করতে পছন্দ করতে পারেন। আপনি একটি নিরবচ্ছিন্ন প্রতীক সহ একটি বেনামী ফাংশনটি জোড়া দিতে পারেন , এবং এটি একই নামের অন্য কোনও চিহ্নের সাথে সাংঘর্ষিক হওয়ার বিষয়ে চিন্তা করবেন না। এটি সাহায্যকারীকে আরও পরিষ্কার করে তোলে, কারণ এটি ফাংশন অবজেক্টের চেয়ে প্রতীক নামটি প্রদর্শন করবে। এই দৃষ্টান্তে আমাদের কাছে লাম্বদা ফর্মটিতে defaliasএম্বেড করার পরিবর্তে ডকস্ট্রিংটি পাস করার বিকল্প রয়েছে ।

(global-set-key
 (kbd "C-c a")
 (let ((foo 1)
       (bar 2))
   (defalias (make-symbol "a-foo-bar-function")
     (lambda ()
       (interactive)
       (+ foo bar))
     (format "Function which sums foo=%s and bar=%s" foo bar))))

বা (এবং এটি খুব একই জিনিস) আপনি নিরবচ্ছিন্ন প্রতীকটি ক্যাপচার করতে এবং আপনার মূল কোড অনুসারে সরাসরি প্রতীক সম্পত্তি সেট করতে পারেন:

(global-set-key
 (kbd "C-c a")
 (let ((foo 1)
       (bar 2)
       (sym (make-symbol "a-foo-bar-function")))
   (put sym 'function-documentation
        (format "Function which sums foo=%s and bar=%s" foo bar))
   (defalias sym
     (lambda ()
       (interactive)
       (+ foo bar)))))

পার্শ্ব নোট হিসাবে, সচেতন থাকুন যে এই ফাংশনটি কেবলমাত্রfoo এবং barযদি আপনি lexical-binding: tআপনার লাইব্রেরির জন্য ব্যবহার করছেন তবে লেট-বাউন্ড মানগুলিকে সংশ্লেষ করতে চলেছে । যদি ফু ও বার গতিশীলভাবে আবদ্ধ থাকে তবে আমি যে ডকাস্ট্রিংগুলি তৈরি করেছি তা সম্ভবত রান-টাইমে সঠিক হবে না। যদিও আমরা গতিশীল ডকাস্ট্রিংসের সাহায্যে সেই পরিস্থিতিটি পূরণ করতে পারি । তথ্য নোড এর সম্পর্কে (elisp) Accessing Documentationবলে documentation-property:

যদি সম্পত্তি মানটি 'শূন্য' হয় না, কোনও স্ট্রিং নয় এবং কোনও ফাইলের পাঠ্যকে উল্লেখ না করে তবে স্ট্রিংটি পাওয়ার জন্য এটি লিস্প এক্সপ্রেশন হিসাবে মূল্যায়ন করা হয়।

প্রতীক-ভিত্তিক যে কোনও পদ্ধতির সাথে আমরা ডকুমেন্টেশন ফর্মটি কল সময়ে মূল্যায়ন করার জন্য উদ্ধৃত করতে পারতাম:

(defalias (make-symbol "a-foo-bar-function")
   (lambda ()
     (interactive)
     (+ foo bar))
   '(format "Function which sums foo=%s and bar=%s" foo bar))

13

ইমাস -২ 25 এ ঠিক সেই উদ্দেশ্যেই একটি নতুন বৈশিষ্ট্য রয়েছে:

(let ((foo 1)
      (bar 2))
  (lambda ()
    (:documentation (format "Return the sum of %d and %d." foo bar))
    (+ foo bar)))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.