এলিসপে মাল্টলাইন ডক্টাস্টিংগুলি হ্যান্ডেল করার জন্য আরও ভাল উপায় কী?


9

আমি যেভাবে এলিস্প (সাধারণভাবে এলআইএসপি হয় তা নিশ্চিত নয়) মাল্টলাইন ডকস্ট্রিংগুলি পরিচালনা করে সেটিকে আমি ঘৃণা করি।

(defun foo ()
  "This is
a multi
liner
docstring"
  (do-stuff))

আমি অবশ্যই আশা করি যে আমি এর মতো কিছু করতে পারি

(defun foo ()
  (eval-when-compile 
    (concat
      "This is\n"
       "a multi\n"
       "line\n"
       "docstring"))
  (do-stuff))

যাতে প্রবর্তন সামঞ্জস্যপূর্ণ ছিল।

দুর্ভাগ্যক্রমে, eval-when-compile কাজটি করে না।

কারো কি কোন ধারনা আছে?


এটি ম্যাক্রো তৈরি করা মোটামুটি সহজ হওয়া উচিত যা প্রসারিত হবে defun। এই পদ্ধতির অপূর্ণতা - এবং এটি একটি বড় - এটি কোনও কোড সফটওয়্যারকে বিভ্রান্ত করবে (এলিস্প সংকলক / দোভাষী ছাড়া অন্য) যা আপনার কোডগুলি অনুসন্ধান করছে তার জন্য অনুসন্ধান করছে defun
হ্যারাল্ড হানচে-ওলসেন

3
মজাদারভাবে যথেষ্ট, আপনার কৌশলটি কাজ না করার কারণটি eval-when-compileতার ফলাফলের উদ্ধৃতি দেয় (এটিকে কোনও মান থেকে অভিব্যক্তিতে পরিণত করা)। যদি এটি কিছুটা বেশি চালাক হয় এবং কেবল তার ফলাফলটি উদ্ধৃত করে যখন এটি স্ব-উদ্ধৃতি না হয়, এটি কার্যকর হবে।
স্টেফান

উত্তর:


7

অবশ্যই my-defunম্যাক্রো হ'ল সহজ উপায়। তবে একটি সহজ সমাধান হবে

(advice-add 'eval-when-compile :filter-return
            (lambda (exp)
              (if (and (eq 'quote (car-safe exp))
                       (stringp (cadr exp)))
                  (cadr exp)
                exp)))

কোনটি আপনার কৌশলটিকে কাজ করে তোলে, কমপক্ষে সমস্ত ক্ষেত্রে যেখানে ফাংশনটি প্রকৃত সংজ্ঞা দেওয়ার আগে ম্যাক্রোপেক্সড হয়, যার মূল ব্যবহারের ক্ষেত্রে অন্তর্ভুক্ত করা উচিত (উদাহরণস্বরূপ এটি কোনও ফাইল থেকে লোড করা হয়েছে, যদি এটি বাইট-সংকলিত হয়, বা যদি এটি সংজ্ঞায়িত হয়) মাধ্যমে M-C-x)।

তবুও, এটি বিদ্যমান বিদ্যমান কোডগুলি ঠিক করে না, সুতরাং এর থেকে উত্তম উত্তরটি এরকম হতে পারে:

;; -*- lexical-binding:t -*-

(defun my-shift-docstrings (orig ppss)
  (let ((face (funcall orig ppss)))
    (when (eq face 'font-lock-doc-face)
      (save-excursion
        (let ((start (point)))
          (parse-partial-sexp (point) (point-max) nil nil ppss 'syntax-table)
          (while (search-backward "\n" start t)
            (put-text-property (point) (1+ (point)) 'display
                               (propertize "\n  " 'cursor 0))))))
    face))

(add-hook 'emacs-lisp-mode-hook
          (lambda ()
            (font-lock-mode 1)
            (push 'display font-lock-extra-managed-props)
            (add-function :around (local 'font-lock-syntactic-face-function)
                          #'my-shift-docstrings)))

যা বাফারের প্রকৃত সামগ্রীকে প্রভাবিত না করে কেবলমাত্র ডাস্ট্রাস্টিংগুলিকে 2 স্পেস দিয়ে স্থানান্তরিত করতে হবে, তবে কেবল প্রদর্শন দিকে।


1
আমি আপনার দ্বিতীয় সমাধানটি সত্যিই পছন্দ করি। তবে পরামর্শের ক্ষেত্রে আমার অযৌক্তিক ভয় আমাকে প্রথমে কব্জায় ফেলেছে। :-)
মালবারবা

6

আপনি এটির মতো ম্যাক্রো ব্যবহার করতে পারেন:

(defmacro my-defun (name arglist &rest forms)
  "Like `defun', but concatenates strings."
  (declare (indent defun))
  (let (doc-lines)
    (while (and (stringp (car-safe forms))
                (> (length forms) 1))
      (setq doc-lines
            (append doc-lines (list (pop forms)))))
    `(defun ,name ,arglist
       ,(mapconcat #'identity doc-lines "\n")
       ,@forms)))

তারপরে আপনি নিজের ফাংশনগুলি এভাবে সংজ্ঞায়িত করতে পারেন:

(my-defun test (a)
  "Description"
  "asodksad"
  "ok"
  (interactive)
  (+ 1 a))

তবুও, আমি দৃ strongly ়ভাবে এই ধরনের প্রান্তিক সুবিধার জন্য মানগুলির বিরুদ্ধে না যাওয়ার পরামর্শ দেব । "অনিয়মিত ইন্ডেন্টেশন" আপনাকে বিরক্ত করে যা কেবল 2 কলাম দ্বারা হয়, এটি উল্লেখ না করে ডকুমেন্টেশনের প্রথম লাইনটি হাইলাইট করতে সহায়তা করে যা আরও গুরুত্বপূর্ণ।


আসলে, একটি defun লাশ হয় মূল্যায়ন (যখন ফাংশন বলা হয়) এবং এটি ম্যাক্রো-প্রসারিত যখন ফাংশন সংজ্ঞায়িত করা হয়। সুতরাং তার কৌশলটি কাজ করতে পারে / করতে পারে।
স্টেফান

@ স্টেফান এটি সত্য। ভুলে eval-when-compileগিয়েছিলেন একটি ম্যাক্রো।
মালবারবা

-1

আমি প্যাকেজগুলি দেখেছি যা ডকাস্ট্রিংগুলি এর মতো সংজ্ঞায়িত করে:

(defun my-function (x y) "
this is my docstring
that lines always lines up
across multiple lines."
  (+ x y))

প্রথম লাইনে প্রথম উক্তি স্থাপন করে তারপরে পাঠ্য আরম্ভ করুন যাতে তারা সমস্ত লাইনে থাকে। এটি অবশ্যই মানক নয় তবে আপনি কেবল এটি করছেন না।


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