s.el's s-lex-format वास्तव में वही है जो आप चाहते हैं, लेकिन यदि आप वास्तव में प्रतिस्थापन ब्लॉकों के अंदर कोड डालना चाहते हैं और न कि केवल चर नाम, मैंने इसे अवधारणा के प्रमाण के रूप में लिखा है।
(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 का उपयोग करने के बजाय प्रारूप प्रकार का उपयोग करने के साथ सुधार किया जा सकता है, लेकिन यह रनटाइम पर करना होगा और ओवरहेड को जोड़ना होगा, लेकिन फ़ंक्शन कॉल में सभी स्वरूप args के आसपास किया जा सकता है जो अच्छी तरह से स्वरूपित करता है चीजें अच्छी तरह से आधारित होती हैं प्रकार पर लेकिन वास्तव में एकमात्र परिदृश्य जहां आप चाहते हैं कि शायद तैरता है और आप प्रतिस्थापन में एक प्रारूप (% f "फ्लोट) भी कर सकते हैं, आप हताश थे।
यदि मैं इस पर अधिक काम करता हूं, तो मुझे इस उत्तर के बजाय इस जिस्ट को अपडेट करने की अधिक संभावना है। https://gist.github.com/jordonbiondo/c4e22b4289be130bc59b