我希望有人帮我这个,因为我找不到任何有用的答案,而且我是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)未满足或是否有其他方法可以执行此操作,是否有任何方法可以返回空白字符?我希望我能很好地解释.谢谢.
如果要充分利用其功能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)
这通过执行以下操作来工作:
~& 除非我们已经在一行的开头,否则插入换行符.~@{...~} 迭代地处理参数.~:[...~;...~]选择nil和非nil案例之间.~:*没有消耗被消耗的论据~:[...~].~A 输出正在处理的项目.~^ 在最后一次迭代中从循环中转义(以便在最后一项之后不输出过多的空格).If有三个参数:condition,then-form,else-form; else-form是可选的.此外,我会使用文字字符语法.
(if (= (nth 0 list) 1)
#\P
#\Space)
Run Code Online (Sandbox Code Playgroud)
文档:
| 归档时间: |
|
| 查看次数: |
2870 次 |
| 最近记录: |