带命名参数的Lisp字符串格式

带命名参数的Lisp字符串格式,lisp,common-lisp,string-formatting,Lisp,Common Lisp,String Formatting,在Lisp中有没有一种方法可以使用命名参数格式化字符串 也许有一些关联列表,比如 (format t "All for ~(who)a and ~(who)a for all!~%" ((who . "one"))) 要打印“一对一,一对所有” 类似于,或,甚至,但在Lisp中 如果该语言中没有此功能,是否有人拥有任何可以完成相同任务的酷函数或宏?使用 字符串插值 对于简单的情况,您不需要: 然后: 解释格式指令 如果需要格式化,可以执行以下操作: (setf cl-interpol:*int

在Lisp中有没有一种方法可以使用命名参数格式化字符串

也许有一些关联列表,比如

(format t "All for ~(who)a and ~(who)a for all!~%" ((who . "one")))
要打印
“一对一,一对所有”

类似于,或,甚至,但在Lisp中

如果该语言中没有此功能,是否有人拥有任何可以完成相同任务的酷函数或宏?

使用

字符串插值 对于简单的情况,您不需要:

然后:

解释格式指令 如果需要格式化,可以执行以下操作:

(setf cl-interpol:*interpolate-format-directives* t)
例如,此表达式:

(let ((who "one"))
  (princ #?"All for ~A(who) and ~S(who) for all!~%"))
。。。印刷品:

All for one and "one" for all!
如果您感到好奇,以上内容如下:

备用读卡器功能 之前,我全局设置了
*插值格式指令*
,它在所有插值字符串中解释格式指令。 如果您想精确控制插入格式指令的时间,就不能在代码中临时绑定变量,因为魔法发生在读取时。相反,您必须使用自定义读取器函数

(set-dispatch-macro-character
 #\#
 #\F
 (lambda (&rest args)
   (let ((cl-interpol:*interpolate-format-directives* t))
     (apply #'cl-interpol:interpol-reader args))))

如果我将特殊变量重置为其默认值NIL,则格式化指令的字符串前缀为
#F
,而普通插值字符串则使用
#?
语法。如果您想更改readtables,请查看。

我不使用它,但我听说CL Interpol需要我。仅供参考,在CL21中可以使用
#“
reader宏。
(let ((who "one"))
  (princ #?"All for ~A(who) and ~S(who) for all!~%"))
All for one and "one" for all!
(LET ((WHO "one"))
  (PRINC
    (WITH-OUTPUT-TO-STRING (#:G1177)
      (WRITE-STRING "All for " #:G1177)
      (FORMAT #:G1177 "~A" (PROGN WHO))
      (WRITE-STRING " and " #:G1177)
      (FORMAT #:G1177 "~S" (PROGN WHO))
      (WRITE-STRING " for all!" #:G1177))))
(set-dispatch-macro-character
 #\#
 #\F
 (lambda (&rest args)
   (let ((cl-interpol:*interpolate-format-directives* t))
     (apply #'cl-interpol:interpol-reader args))))