以Clojure格式(java.util.Formatter),cl-format(Common Lisp格式)以编程方式控制填充?

时间:2013-11-25 05:46:53

标签: java clojure common-lisp string-formatting

有没有办法使用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指令可以简单地将format参数的值插入到format指令中,然后使用生成的construct指令来处理下一个参数。但是,我还没有在CL HyperspecCLTL2中找到这样的指令(这并不意味着信息不存在)。到目前为止,我还没有在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的行为的风险{1}}使用字符串,这是一种无意的用法。)

1 个答案:

答案 0 :(得分:3)

在Common Lisp中,您可以使用v作为前缀参数,例如:

(format nil "~vd" 10 42)

这里记录了:http://clhs.lisp.se/Body/22_c.htm

  

代替指令的前缀参数,可以使用V(或v)。在这种情况下,format将args中的参数作为指令的参数。