如何在Lisp格式函数中打印空白字符?

如何在Lisp格式函数中打印空白字符?,lisp,whitespace,Lisp,Whitespace,我希望有人能帮我解决这个问题,因为我找不到任何有用的答案,而且我还不熟悉Lisp 我要做的是测试一个元素的值,如果它是1,则打印它,否则打印空白字符。 当所有列表参数的值均为1时,此选项有效: (defun print-lst (list) (format t "~%~a ~a ~a~%" (if (= (nth 0 list) '1) '¦) (if (= (nth 1 list) '1) 'P

我希望有人能帮我解决这个问题,因为我找不到任何有用的答案,而且我还不熟悉Lisp

我要做的是测试一个元素的值,如果它是1,则打印它,否则打印空白字符。 当所有列表参数的值均为1时,此选项有效:

(defun print-lst (list)
  (format t "~%~a ~a ~a~%"
          (if (= (nth 0 list) '1)
              '¦)
          (if (= (nth 1 list) '1)
              'P)
          (if (= (nth 2 list) '1)
              '¦)))
因此,输出为
p
。但是,如果列表中的第二个元素是0,它在该位置打印NIL
NIL
,我希望它打印一个空格,而不是
alpha
(不仅仅是跳过该字符
alpha
,如果测试值不是1,则在输出行的该位置有一个空白字符很重要)

如果未满足条件
(如果(=(第n个列表)'1)'p)
,是否有任何方法返回空白字符,或者是否有其他方法执行此操作?
我希望我解释得很好。谢谢。

如果
接受三个参数:条件,然后是形式,否则是形式;else表单是可选的。此外,我会对文字字符使用文字字符语法

(if (= (nth 0 list) 1)
    #\P
    #\Space)
文件:

    • 反问题:
      您真的需要标识符(“某物”)的输出值,还是字符串文本也可以(“某物”)的输出值

      如果第一个是真的:我想不可能使用空格作为标识符。
      如果第二个为真:使用“|”、“P”和“”作为输出值


      也就是说,看起来您可能希望在这里使用它的一些更高级别的指令。查看Lisp Hyperspec的一节和(特别是,查看处理条件格式的一节)。

      如果您想充分利用
      格式的强大功能,可以使用格式条件和格式转到的组合

      像这样:

      [1]> (format nil "~@{~:[<nothing>~;~:*~A~]~^ ~}" 1 2 nil 4 nil 6)
      "1 2 <nothing> 4 <nothing> 6"
      
      这通过执行以下操作来实现:

    • ~&
      插入新行,除非我们已经在一行的开头
    • ~@{…~}
      以迭代方式处理参数
    • ~:[…~;…~]
      nil
      和非
      nil
      案例之间进行选择
    • ~:*
      取消使用
      ~:[…~]
      使用的参数
    • ~A
      输出正在处理的项目
    • ~^
      在最后一次迭代时从循环中转义(以免在最后一项之后输出过多的空间)

    • 谢谢,这很有帮助。我知道一个事实,若语句包含3个参数,我只是不知道如何生成空格字符,但看起来很简单(我是Lisp的新手)。有用的链接,我肯定会查看它们。谢谢。@BojanZdravkovic:顺便说一句,你不需要引用字面形式,因为它们会自行计算。这很酷。:)我第一次使用这个功能,现在我看到它有很多选择,它非常强大。:)哇!这正是我想要的。我不可能一个人就知道。谢谢。您可以使用
      (第一个列表)
      (第二个列表)
      (第三个列表)
      来代替第n个列表。不需要引用像
      1
      这样的原子,它们已经对自己进行了计算。此外,除非您真的需要,否则不要使用数字相等
      (=(第三个列表)1)
      不仅在
      (第三个列表)
      包含1时为真,而且在它包含浮点值1.0时也为真。此外,如果
      (第三个列表)
      包含一个非数字,则会出现错误情况。这就是你想要的吗?@Kaz:我知道这一切。这只是一个学校项目,列表参数不会包含浮点或非数值,只包含整数1或0。
      (format t "~&~@{~:[ ~;~:*~A~]~^ ~}"
              ...)