s.el এর এস-লেক্স-ফর্ম্যাটটি আপনি যা চান তা হ'ল তবে আপনি যদি কেবল পরিবর্তনশীল নামগুলি না করে বিকল্পধারার ব্লকগুলির ভিতরে কোড রাখতে সক্ষম হন তবে আমি এটি ধারণার প্রমাণ হিসাবে লিখেছি।
(defmacro fmt (str)
"Elisp string interpolation for any expression."
(let ((exprs nil))
(with-temp-buffer
(insert str)
(goto-char 1)
(while (re-search-forward "#{" nil t 1)
(let ((here (point))
(emptyp (eql (char-after) ?})))
(unless emptyp (push (read (buffer-substring (point) (progn (forward-sexp 1) (point)))) exprs))
(delete-region (- here 2) (progn (search-forward "}") (point)))
(unless emptyp (insert "%s"))
(ignore-errors (forward-char 1))))
(append (list 'format (buffer-string)) (reverse exprs)))))
;; demo with variable and code substitution
(fmt "My name is #{user-full-name}, I am running Emacs #{(if (display-graphic-p) \"with a GUI\" \"in a terminal\")}.")
;; results in
"My name is Jordon Biondo, I am running Emacs with a GUI."
আপনি পাগল হয়ে থাকলে আপনি fmt
অন্যের মধ্যেও একটি কল এম্বেড করতে পারেনfmt
(fmt "#{(fmt\"#{(fmt\\\"#{user-full-name}\\\")}\")}")
;; =>
"Jordon Biondo"
কোডটি কেবলমাত্র একটি format
কলটিতে প্রসারিত হয় যাতে সমস্ত বিকল্পগুলি যথাসময়ে করা হয় এবং রান সময়ে মূল্যায়ন করা হয়।
(cl-prettyexpand '(fmt "Hello, I'm running Emacs #{emacs-version} on a #{system-type} machine with #{(length (window-list))} open windows."))
;; expands to
(format "Hello, I'm running Emacs %s on a %s machine with %s open windows."
emacs-version
system-type
(length (window-list)))
সর্বদা% s ব্যবহারের পরিবর্তে বিন্যাসের ধরণটি কীভাবে ব্যবহৃত হবে তা দিয়ে উন্নতি করা যেতে পারে, তবে এটি রানটাইমের সময় করতে হবে এবং ওভারহেড যুক্ত হবে তবে একটি ফাংশন কলের সমস্ত বিন্যাসের চারপাশে তৈরি করা যেতে পারে যা সুন্দরভাবে ভিত্তিতে জিনিসগুলি বিন্যাস করে টাইপ করুন তবে সত্যই একমাত্র দৃশ্য যেখানে আপনি চান এটি সম্ভবত ভাসমান এবং আপনি প্রতিস্থাপনে একটি (ফর্ম্যাট "% f" ভাসা) করতেও পারতেন আপনি হতাশ হয়েছিলেন।
আমি যদি এটিতে আরও কাজ করি তবে আমি এই উত্তরের পরিবর্তে এই সূচকটি আপডেট করার সম্ভাবনা বেশি। https://gist.github.com/jordonbiondo/c4e22b4289be130bc59b