关于s-format使用的一个疑问:变量格式化问题

有几行代码:

(require 's)
(setq func-name "myfunc")
(setq args-desc "xxx")
(s-format "name: ${name}, args: ${args}" 'aget '(("name" . func-name) ("args" . args-desc)))

期待输出:

"name: myfunc, args: xxx"

而实际输出了:

"name: func-name, args: args-desc"

请教:怎么让最后一行的func-nameargs-desc的值格式化到字符串中,而非变量名本身?

用 backquote:

(s-format "name: ${name}, args: ${args}" 
   'aget `(("name" . ,func-name) ("args" . ,args-desc)))

或者写全:

(s-format "name: ${name}, args: ${args}" 
   'aget (list (cons "name"  func-name) (cons "args" args-desc)))

感谢!还找到了另一个函数s-lex-format也可以实现同样的效果:

(setq func-name "myfunc")
(setq args-desc "xxx")
(let ((name func-name) (args args-desc))
  (s-lex-format "name: ${name}, args: ${args}"))

输出:

"name: myfunc, args: xxx"

为什么不直接用 format:

 (let ((name "myfunc")
       (args "xxx"))
  (format "name: %s, args: %s" name args))

那是因为我格式化字符串中有很多个相同的参数(上面的字符串只是简单的举个例子),比如有10个${name},用format太累了

got it.