我有一个要打印为固定列网格的字符列表。我想为每个line-width
打印到换行符。
例如,我想要
(#\Y #\q #\J #\u #\( #\t #\n #\m #\@ #\& #\c #\z #\x #\? #\} #\_ #\0 #\@ #\q #\r #\f #\/ #\I #\1 #\; #\B #\& #\O #\O #\O #\Y #\( #\n #\i #\0 #\B #\L #\h #\* #\# #\1 #\r #\? #\k #\& #\J #\J #\x #\# #\x #\i #\d #\Q #\o #\J #\J #\O #\o #\n #\_ #\v #\t #\r #\X #\c #\J #\X #\t #\z #\( #\) #\b #\C #\f #\x #\z #\d #\f #\Q #\t #\w)
显示为:
YqJu(tnm@
&czx?}_0@
qrf/I1;B&
OOOY(ni0B
Lh*#1r?k&
JJx#xidQo
JJOon_vtr
XcJXtz()b
CfxzdfQtw
这是我尝试过的:
(define (char-display char-list line-width)
(for ([char (in-list char-list)]
[i (in-range line-width)])
(cond
[(zero? i) (void)] ; to make sure modulo does not operate on zero
[(zero? (modulo line-width i)) (display #\newline)]
[else (display char)])))
调用上面的列表并且线宽为9的函数时,我得到:
J
(tnm@[
我在做什么错? 有更好的方法吗?
答案 0 :(得分:2)
其他人已经提供了很好的答案。我只想指出in-slice
,在这种情况下可能会有帮助。
(define (char-display char-list line-width)
(for ([chars (in-slice line-width char-list)])
(map display chars)
(newline)))
答案 1 :(得分:1)
在
(define (char-display char-list line-width)
(for ([char (in-list char-list)]
[i (in-range line-width)])
...))
char
和i
分别贯穿char-list
和数字0, 1, ..., linewidth-1
。他们并行进行。当一个序列用完时,循环停止。
这里的数字序列最短,您只能看到一行。
因此,第一个更改是将第二个条款更改为
[i (in-naturals)]
第二个更改是模数的参数顺序(它们需要交换):
(modulo i line-width)
第三个更改是始终显示一个字符。可能只显示换行符。
(define (char-display char-list line-width)
(for ([char (in-list char-list)]
[i (in-naturals)])
(when (zero? (modulo i line-width))
(unless (zero? i)
(newline)))
(display char)))
答案 2 :(得分:1)
这有效:
(define (char-display char-list line-width)
(for ([char (in-list char-list)]
[i (in-naturals 1)])
(display char)
(when (zero? (modulo i line-width))
(newline))))
您的代码有几个问题:
(in-range line-width)
只会产生不超过line-width
的整数,您需要产生与列表中字符一样多的整数。1
处开始整数序列,以避免必须在零时开始处理边缘情况。modulo
的参数顺序错误。