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

InP*_*ess 3 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)
          (if (= (nth 2 list) '1)
              '¦)))
Run Code Online (Sandbox Code Playgroud)

所以输出是¦ P ¦.但是,如果列表中的第二个元素为0,它会在该位置打印NIL ¦ NIL ¦而我希望它打印一个空格¦ ¦(不仅仅是跳过该字符¦¦,重要的是输出行中该位置有一个空白字符,如果测试值不是1).

如果条件(if (= (nth 1 list) '1) 'P)未满足或是否有其他方法可以执行此操作,是否有任何方法可以返回空白字符?我希望我能很好地解释.谢谢.

Mat*_*ard 6

如果要充分利用其功能format,可以使用格式条件和格式GOTO的组合.

像这样:

[1]> (format nil "~@{~:[<nothing>~;~:*~A~]~^ ~}" 1 2 nil 4 nil 6)
"1 2 <nothing> 4 <nothing> 6"
Run Code Online (Sandbox Code Playgroud)

在你的情况下,这应该工作:

(format t "~&~@{~:[ ~;~:*~A~]~^ ~}"
        ...)
Run Code Online (Sandbox Code Playgroud)

这通过执行以下操作来工作:

  1. ~& 除非我们已经在一行的开头,否则插入换行符.
  2. ~@{...~} 迭代地处理参数.
  3. ~:[...~;...~]选择nil和非nil案例之间.
  4. ~:*没有消耗被消耗的论据~:[...~].
  5. ~A 输出正在处理的项目.
  6. ~^ 在最后一次迭代中从循环中转义(以便在最后一项之后不输出过多的空格).


Sva*_*nte 5

If有三个参数:condition,then-form,else-form; else-form是可选的.此外,我会使用文字字符语法.

(if (= (nth 0 list) 1)
    #\P
    #\Space)
Run Code Online (Sandbox Code Playgroud)

文档: