有没有办法使用Clojure forrmat
(基于java.util.Formatter
)或cl-format
(基于Common Lisp的format
)以编程方式设置空间填充?如果您事先知道所需的宽度,这些都将返回" foo"
:
(format "%6s" "foo")
(clojure.pprint/cl-format nil "~6d" "foo")
但是,如果我想让程序决定返回的字符串的宽度应该怎么办?显然,我可以手动构造格式字符串,例如:
(def width 6)
(format (str "%" width "s") "foo")
但是我想我记得有一个Common Lisp
format
指令,可以将格式参数的值简单地插入到格式指令中,然后使用生成的构造指令来处理下一个参数。但是,我尚未在CL Hyperspec或CLTL2中找到这样的指令(这并不意味着信息不存在)。到目前为止,我也没有在java.util.Formatter
文档中发现这样的指令。在这些格式设置函数/类中的任何一种中,是否可以使用指令控制指令?(我不确定我的
cl-format
示例是否应该工作,因为d
是数字格式指令。它确实在Clojure 1.5.1中有效。相同的技巧在CLISP中对format
有效,但不能在SBCL,ABCL,CCL或ECL中。)编辑:
(我发现,将字符串左移的正确方法是将
@
添加到a
指令,而不是使用d
:(clojure.pprint/cl-format nil "~6@a" "foo")
此方法应始终在Common Lisp中起作用,并且通过在Clojure中使用
@a
而不是d
,可以避免将来cl-format
的实现会更改带有字符串的d
行为的风险,这是意外的使用。) 最佳答案
在Common Lisp中,您可以将v
用作前缀参数,例如:
(format nil "~vd" 10 42)
它记录在这里:http://clhs.lisp.se/Body/22_c.htm
可以使用V(或v)代替指令的前缀参数。在这种情况下,format将args中的参数作为指令的参数。