ফর্ম্যাট-টাইম-স্ট্রিংয়ের মতো কোনও ফাংশন বাস্তবায়নের সবচেয়ে সহজ উপায়


12

format-time-string ফাংশন একটি পংক্তি লাগে, এবং যে স্ট্রিং (অক্ষর দ্বারা preceeded বিশেষ নির্মান একটি সেট প্রতিস্থাপন %) কিছু নির্দিষ্ট পাঠ্য সহ।

আমি আমার নিজস্ব কোনও ফাংশনে এর মতো একটি কার্যকারিতা বাস্তবায়ন করতে চাই:

  • আমি অক্ষর এবং মত চিহ্ন মধ্যে একটি alist আছে: '((?n . name) (?r . reputation))
  • ফাংশনটির মতো স্ট্রিং নেওয়া উচিত "My name is %n, and my rep is %r"
  • এটি প্রতিস্থাপন করা উচিত %nএবং %rভেরিয়েবল মান nameএবং reputation, এবং এর ফলে ফিরে যান।
  • এটি পরিচালনা করা উচিত %%ঠিক format-time-string(সঙ্গে এটি প্রতিস্থাপন %)।

এই ফাংশনটি বাস্তবায়নের সহজতম উপায় কী?
এমন কোনও লাইব্রেরি বা ফাংশন রয়েছে যা এটিকে সহজ করবে? %%সঠিকভাবে পরিচালনা করা গুরুত্বপূর্ণ।

উত্তর:


19

ডিফল্ট ফাংশন ব্যবহার করা হয় format-specএবং format-spec-make:

(let* ((name "Malabarba")
       (reputation "good")
       (fs (format-spec-make ?n name ?r reputation)))
  (format-spec "My name is %n, with a %r reputation.  %% is kept." fs))

1
ভাল, ইতিমধ্যে ইমাসগুলিতে এ জাতীয় কোনও জিনিস উপস্থিত হওয়ার আশা করেনি। বিশেষত ভালটি হ'ল অবৈধ ফর্ম্যাট কোডগুলি অন্তর্ভুক্ত করার জন্য প্রাথমিক ত্রুটি হ্যান্ডলিংয়ের রয়েছে।
ওয়াসমাস

7

যেহেতু এলিস্পের স্ট্রিংগুলি মোকাবেলা করার পরিবর্তে প্রাথমিক সুবিধা রয়েছে তাই আপনার ফর্ম্যাট স্ট্রিংটিকে একটি বাফারের মধ্যে রাখাই ভাল এবং তারপরে পুনরাবৃত্তি করা ভাল:

(defvar malabarba-alist '((?n . "Malabarba") (?r . 7488) (?% . "%")))

(defun malabarba-format (string)
  (with-temp-buffer
    (insert string)
    (goto-char 1)
    (while (search-forward "%" nil t)
      (let ((s (cdr (assoc (char-after) malabarba-alist))))
        (cond
          (s (delete-char -1) (delete-char 1) (insert (format "%s" (eval s))))
          (t (unless (eobp) (forward-char))))))
    (buffer-string)))

একটি সামান্য সূক্ষ্মতা - %স্ট্রিং শেষে একাকী হয়ে গেলে এটি ভেঙে যায় না কারণ বাফারের শেষে char-afterফিরে আসে nil


হ্যাঁ, এই পদক্ষেপটি একবারে স্ট্রিংয়ের মাধ্যমে অগ্রগতির, @ অ্যালানশুতকো দ্বারা ব্যবহৃত, আরও অর্থবোধ করে। আমি আমার উত্তর মুছে ফেলেছি।
ড্রিউ

3

এখানে এমন একটি কোড যা আমি একটি জাল ক্যালেন্ডারের জন্য ফর্ম্যাট-টাইম-স্ট্রিংয়ের জন্য ব্যবহার করি:

(defun mystcal-format-time (format-string time)
  "Format time
%Y is the year.
%m is the numeric month.
%B is the full name of the month.
%d is the day of the month, zero-padded, %e is blank-padded.
%u is the numeric day of week from 1 (Monday) to 7, %w from 0 (Sunday) to 6.
%A is the locale's full name of the day of week.
%H is the hour on a 24-hour clock, %I is on a 12-hour clock, %k is like %H
 only blank-padded, %l is like %I blank-padded.
%p is the locale's equivalent of either AM or PM.
%M is the minute.
%S is the second."
  (let* (output
         (start 0)
         (decoded-time (if (listp time)
                           time
                         (mystcal-decode-time time)))
         (turn (nth 0 decoded-time))
         (minute (nth 1 decoded-time))
         (hour (nth 2 decoded-time))
         (day (nth 3 decoded-time))
         (month (mystcal-month decoded-time))
         (year (nth 5 decoded-time))
         (weekday (mystcal-weekday-of-day day))
         (hour12 (mod hour 12)))
    (save-match-data
      (while (string-match "%" format-string start)
        (let ((index (match-beginning 0)))
          ;; First copy non-format text
          (setq output (concat output (substring format-string start 
                                                 index)))
          ;; Process format codes here
          (let (fmted)
            (setq output (concat output 
                                 (case (aref format-string (1+ index))
                                   (?Y (number-to-string year))
                                   (?m (number-to-string month))
                                   (?B (mystcal-month-name month))
                                   (?d (format "%02d" day))
                                   (?e (format "%2d" day))
                                   (?u (number-to-string (if (zerop weekday)
                                                             7
                                                           weekday)))
                                   (?w (number-to-string weekday))
                                   (?A (mystcal-weekday-name 
                                        (mystcal-weekday-of-day day)))
                                   (?H (format "%02d" hour))
                                   (?k (format "%2d" hour))
                                   (?I (format "%02d" (if (zerop hour12) 12 hour12)))
                                   (?l (format "%2d" (if (zerop hour12) 12 hour12)))
                                   (?p (if (< hour 12)
                                           "AM" "PM"))
                                   (?M (format "%02d" minute))
                                   (?S "00")))))
          (setq start (+ 2 index)))))
    (setq output (concat output (substring format-string start)))
    output))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.