Scheme 如何从字符列表中输出字符网格?

Scheme 如何从字符列表中输出字符网格?,scheme,racket,Scheme,Racket,我有一个字符列表,我想打印出来作为固定列的网格。对于每个行宽度,我要打印到换行符 例如,我想要 (#\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 #

我有一个字符列表,我想打印出来作为固定列的网格。对于每个
行宽度
,我要打印到换行符

例如,我想要

(#\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
这就是我尝试过的:

(定义(字符显示字符列表线宽)
(用于([字符(列表中字符列表)]
[i(范围内线宽)])
(续)
[(零?i)(无效)];确保模不在零上运行
[(零?(模线宽i))(显示#\newline)]
[其他(显示字符)])
使用上述列表和9的线宽调用函数时,我得到:


J
(tnm@[
我做错了什么? 有更好的方法吗?

(define (char-display char-list line-width)
  (for ([char (in-list char-list)]
        [i (in-range line-width)])
    ...))
char
i
分别通过
char list
和数字
0、1、…、线宽-1
。它们是并行的。当一个序列耗尽时,循环停止。 这里的数字序列最短,您只能看到一行

因此,第一个变更是将第二个for条款变更为

[i (in-naturals)]
第二个变化是模的参数顺序(它们需要交换):

第三个变化是始终显示一个字符。只有换行符可以显示,也可以不显示

(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)))
这项工作:

(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))))
您的代码有几个问题:

  • 执行
    (范围内的线宽)
    只会生成小于等于
    线宽的整数,您需要生成与列表中字符数量相同的整数
  • 我们可以在
    1
    处开始整数序列,以避免在开始时处理零的边情况
  • 的参数顺序错误
  • 您必须在所有迭代中显示字符,当模为零时,您跳过了一些字符

    • 其他人已经给出了很好的答案。我只想指出slice中的
      ,这在这种情况下可能会很有帮助

      (定义(字符显示字符列表线宽)
      (用于([字符(在片线宽度字符列表中)])
      (地图显示字符)
      (新行)))
      
      btw,您可以使用for each代替map,因为结果会被丢弃。这是一个很好的答案!我也花了一段时间才发现片中的
      racket/sequence
      的一部分,而不是
      racket/base
      (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))))