有没有办法使用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 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行为的风险,这是意外的使用。)

最佳答案

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

(format nil "~vd" 10 42)


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


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

09-04 23:58
查看更多