我希望有人帮我这个,因为我找不到任何有用的答案,而且我是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)
未满足或是否有其他方法可以执行此操作,是否有任何方法可以返回空白字符?
我希望我能很好地解释。谢谢。
答案 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~]~^ ~}"
...)
通过执行以下操作:
~&
会插入换行符。~@{...~}
迭代地处理参数。~:[...~;...~]
在nil
和非nil
案例之间进行选择。~:*
无法使用~:[...~]
消耗的参数。~A
输出正在处理的项目。~^
在最后一次迭代时从循环中转义(以免在最后一项之后输出过多的空格)。答案 2 :(得分:0)
反问题:
你真的需要输出值是标识符('某事)还是字符串文字工作(“某事”)?
如果第一个为真:我认为不可能使用空格作为标识符 如果第二个为真:使用“|”,“P”和“”作为输出值
答案 3 :(得分:0)
Format is a beast waiting to devour the unwary
那就是说,你可能想在这里使用一些更高级别的指令。查看Lisp Hyperspec的Formatted Output部分和format chapter of PCL(具体来说,请查看处理条件格式的部分)。