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

时间:2012-04-27 12:58:41

标签: 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)
              '¦)))

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

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

4 个答案:

答案 0 :(得分:5)

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

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

文档:

答案 1 :(得分:5)

如果您想充分利用format的强大功能,可以使用格式条件的组合并格式化GOTO。

像这样:

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

在您的情况下,这应该有效:

(format t "~&~@{~:[ ~;~:*~A~]~^ ~}"
        ...)

通过执行以下操作:

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

答案 2 :(得分:0)

反问题:
你真的需要输出值是标识符('某事)还是字符串文字工作(“某事”)?

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

答案 3 :(得分:0)

Format is a beast waiting to devour the unwary

那就是说,你可能想在这里使用一些更高级别的指令。查看Lisp Hyperspec的Formatted Output部分和format chapter of PCL(具体来说,请查看处理条件格式的部分)。