【问题标题】:How would I print out a list with spaces in between elements我将如何打印出元素之间有空格的列表
【发布时间】:2021-09-15 06:56:50
【问题描述】:

所以我试图打印出一个看起来有点像 (setq lst (list '- '- '- '- '-)) 的列表,过去我使用 print 命令打印出整个列表,但是,当打印整个列表时有括号在我不想看到的每一面。我想使用(format t) 之类的东西来打印我列表的每一位,并且我有这样的设置。

(loop for item from 0 to 4
     do (progn
             (format t "~X" (nth item lst))
        )
)

这段代码像这样完美地打印出列表,-----,但如前所述,我希望它在每个元素之间打印空格,以便像这样输出- - - - -。我使用了条件"~X",因为我查找了如何使用格式命令输出空格,您显然应该使用"~X",但它不起作用,所以如果有人知道我如何在元素之间放置空格,将不胜感激.

【问题讨论】:

标签: common-lisp


【解决方案1】:

关于您在自己帖子的答案中发布的更新:

  • 首先,您应该编辑您的帖子,向我们展示您找到了解决方案,而不是让我们查看所有答案,看看您在最初的问题上取得了多大进展。
  • 正如在另一个答案中已经提到的那样,您可以使用 format 内置语法和 ~{~}~^ 遍历列表的元素(请参阅文档!)
  • 在您自己的解决方案中,当您使用loop 遍历列表时,您可以在格式字符串的末尾放置一个空格,而不是调用format 两次...
  • 您可以使用 loop for <elt> in <list> 而不是使用索引进行迭代,并在每一步调用 nth - 这更慢,也更冗长。
  • loop ... do <stuff> 已经将 <stuff> 包装在我们所谓的隐式 progn 中,也就是说,您不需要将所有指令包装在 progn 中,loop 宏会为您做到这一点。李>
  • 还存在宏 dolist,在您只想遍历列表的情况下(可以说)使用起来更简单。

说句公道话,看起来您是 Common Lisp 初学者。在这种情况下,我建议您阅读优秀的Practical Common Lisp 书籍,其中详细介绍了循环宏、格式化函数以及许多基本原理。它可以在线免费获得,并且经常推荐给初学者,这是有充分理由的!

【讨论】:

    【解决方案2】:

    好的,我想出了一个巧妙的解决方案来解决我之前绝对应该看到的问题。

    (loop for item from 0 to 4
         do (progn
                 (format t "~X" (nth item lst))
                 (format t " ")
            )
    )
    

    我没有意识到我可以打印这样的空间,但它工作得非常好。很抱歉浪费了大家的时间,但希望其他人和我一样有脑子放屁的人可以看到这一点,并感谢所有试图提供帮助的人。

    【讨论】:

      【解决方案3】:

      为什么不直接使用format提供的功能:

      CL-USER> (defvar *my-list* '(- - - -))
      *MY-LIST*
      CL-USER> (format nil "~{~A~^  ~}" *my-list*)
      "-  -  -  -"
      CL-USER> (format t "~{~A~^  ~}" *my-list*)
      -  -  -  -
      NIL
      

      这里第一次调用format 会输出一个字符串来显示空格的位置。 ~{ 是一个以列表为参数的迭代指令。开始 ~{ 和结束 ~} 之间的指令被重复用作输入列表元素的格式字符串。当没有更多参数时,~^ 指令会导致从迭代上下文中提前退出;这可以防止添加尾随空格。

      format 的第二次调用只是输出到*standard-output*

      【讨论】:

      • 我之所以不这样做是因为我需要能够索引列表中的每个项目,并且在字符串上运行函数是我不知道该怎么做的事情。
      • 好吧,现在我不确定您要完成什么。为什么需要索引每个列表元素? Why are you using nested lists "in reality"? 我的回答是“如何打印元素之间有空格的列表”,但新要求并不清楚;一个好的minimal reproducible example 在这里会有所帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多