Lisp语言格式的字符的次数Lisp语言格式的字符的次数(Lisp format a charact

2019-05-12 08:09发布

我正在寻找一种方式来输出字符的数字的使用格式倍。 这可能吗? 有人可以填补_?_的,这样的例子作品?

(let ((n 3))
  (format nil "_?_" _?_ #\* _?_ ))

应该返回

=> "***"

Answer 1:

很高兴看到这么多的解决方案:〜A,〜<和〜{至今。

所述〜@ {迭代构建体提供简洁的解决方案:

(format nil "~v@{~A~:*~}" 3 #\*)


Answer 2:

如果您使用的~A指令,你可以在正是你建议的形式,即得到这个,

(let ((n 3))
  (format nil "_?_" _?_ #\* _?_ ))

三个格式参数。 但是,如果你使用~< ,实际上你可以仅使用两个格式参数做到这一点。 如果你不需要一个已经被产生了一些其他字符串内此字符串format ,你也可以只让使用字符串make-string

使用波形符A(〜A)

你可以打印的字符并指定一个最小宽度和相同的字符作为填充字符。 例如,使用~v,,,vA和两个参数,可以确保打印的字符一定数量,什么填充字符。

CL-USER> (let ((n 3))
           (format nil "~v,,,vA"
                   n     ; number of characters that must be printed
                   #\*   ; character to use as padding
                   #\*)) ; character to print with ~A
"***"

CL-USER> (let ((n 3))
           (format nil "~v,,,vA" n #\* #\*)) 
"***"

CL-USER> (let ((n 10))
           (format nil "~v,,,vA" n #\* #\*))
"**********"

它使用的完整形式~A

〜mincol,colinc,minpad,padcharA是〜A,其允许填充的控制的完整形式。 该字符串被填充在右侧(或在如果使用@改性剂左)与padchar的至少minpad副本; 然后填充字符被一次插入colinc字符,直到总宽度至少mincol。 默认值是0 mincol和minpad,1 colinc,以及用于padchar空格字符。

以及v

代替前缀参数一个指令,V(或V),可以使用的。 在这种情况下,格式需要于argS作为参数传递给该指令的参数。 参数应该是一个整数或字符。 如果通过V参数中使用的arg是零,其效果是因为如果参数已被省略。 #来代替前缀参数的使用; 它代表剩余的要处理的参数的个数的数目。 当一个递归格式中使用,在〜的背景下? 或〜{,#前缀参数表示的递归调用内剩余的格式参数的个数。

使用波浪号小于(〜<)

还有一个不太常用的格式指令,波浪不到,这是用于理由。 它需要一个格式字符串,使小号

〜mincol,colinc,minpad,padchar <STR〜>

这证明一个字段内通过处理STR产生宽至少mincol列的文字。 STR可以被分成用〜;,段在这种情况下,间隔均匀地将文本段之间划分。

通过使一个空的格式字符串和指定只是宽度和填充字符我们可以(AB)使用此:

CL-USER> (let ((n 3))
           (format nil "~v,,,v<~>"
                   n     ; width
                   #\*)) ; padding character
"***"

CL-USER> (let ((n 5))
           (format nil "~v,,,v<~>" n #\*))
"*****"

只是做一个字符串

当然,除非你需要,你已经格式化其他字符串里面这个特殊的字符串,你应该做的wvxvw建议,只是用make-string

(make-string 3 :initial-element #\*)

其他选择

format是非常灵活,因为这和其他的答案是指出,有很多方法可以做到这一点。 我试着坚持那些应为此在一个通道,而不是做明确的迭代,但是这是可以做到的format迭代,也因为拉斯Brinkhoff和wvxvw人士指出。



Answer 3:

(format nil "~a~:*~a~:*~a~:*" #\*)
"***"

或者,详细阐述了约书亚·泰勒的回答一下:

(format nil "~v{~a~:*~}" 3 '(#\*))

会是这样的一种方式。 不要在星号混淆format指令,它们是控制字符,无法打印的字符。


在效率方面,但是,这样的:

(make-string 3 :initial-element #\*)

将达到相同的效果的优选方式。



Answer 4:

拉斯一样的答案,但我们写的字王氏~C ,而不是使用打印机~A

(format nil "~v@{~C~:*~}" 3 #\*)

写文字的东西,如write-char是一个比印刷Lisp的对象更简单的操作。 打印机有很多方面的观察和已经找到打印对象的正确途径。 OTOH,像WRITE-CHAR只是写一个字符到流。



文章来源: Lisp format a character a number of times