bri*_*n_o 6 format common-lisp
我一直在寻找格式化食谱,我找不到我想要的东西......
(format nil CONTROL-STRING day name num-apples)
假设我不想改变上面形式的参数,只是CONTROL-STRING.
day而且num-apples永远不会是零,但name可能是零.
什么时候name为零,我希望输出看起来像
"Today is Monday. Hello, you have 3 apples."
但是当name定义时,我希望它看起来像
"Today is Monday. Hello Adam, you have 3 apples."
因此控制字符串需要查看name,在非零情况下使用它,而不是在nil情况下使用它,但在两种情况下都使用它.
也许它可以通过消耗零和打印它来实现""?如果是这样,我不知道该怎么做.
Jos*_*lor 10
您链接的问题,将nil参数解释为空字符串而不是"NIL"的Lisp格式指令,确实包含一个答案,说明如何执行此操作,但不引用任何文档.由于您正在生成英文文本,因此您还可以考虑其他一些选项.
首先,使用〜@ [结果〜],您可以在参数为非零的情况下处理结果格式指令,并且〜@ [的参数不被消耗,因此它仍然可用.一般来说, 22.3.7.2 Tilde Left-Bracket:Conditional Expression描述了很多选项,但是关于〜@ [它说:
〜@ [结果〜]测试参数.如果为真,则参数不会被〜[命令用尽,但仍作为下一个要处理的参数,并处理一个子句结果.如果arg为false,则参数将用完,并且不处理该子句.因此,该条款通常应该只使用一个参数,并且可能期望它是非零的.
您可以按如下方式使用:
(defun test (day name n-apples)
(format nil "Today is ~a. Hello~@[ ~a~], you have ~a apples."
day name n-apples))
Run Code Online (Sandbox Code Playgroud)
CL-USER> (test 'monday 'adam 2)
"Today is MONDAY. Hello ADAM, you have 2 apples."
CL-USER> (test 'tuesday nil 42)
"Today is TUESDAY. Hello, you have 42 apples."
Run Code Online (Sandbox Code Playgroud)
为了使这个更加健壮,你应该考虑使用~p进行复数化,这样你就得到"1 apple"和"3 apple s ".
(defun test (day name n-apples)
(format nil "Today is ~a. Hello~@[ ~a~], you have ~a apple~:P."
day name n-apples))
Run Code Online (Sandbox Code Playgroud)
CL-USER> (test 'monday 'john 2)
"Today is MONDAY. Hello JOHN, you have 2 apples."
CL-USER> (test 'tuesday 'john 1)
"Today is TUESDAY. Hello JOHN, you have 1 apple."
CL-USER> (test 'wednesday nil 0)
"Today is WEDNESDAY. Hello, you have 0 apples."
Run Code Online (Sandbox Code Playgroud)
最后,由于您正在生成文本,您可能会感谢某些案例规范化(例如,使用首字母大写打印专有名词),并在文本中写入数字:
(defun test (day name n-apples)
(format nil "Today is ~:(~a~). Hello~@[ ~:(~a~)~], you have ~r apple~:P."
day name n-apples))
Run Code Online (Sandbox Code Playgroud)
CL-USER> (list
(test 'monday 'adam 4)
(test 'tuesday 'john 1)
(test 'wednesday 'mary\ sue 42)
(test 'thursday 'jim-bob 0))
("Today is Monday. Hello Adam, you have four apples."
"Today is Tuesday. Hello John, you have one apple."
"Today is Wednesday. Hello Mary Sue, you have forty-two apples."
"Today is Thursday. Hello Jim-Bob, you have zero apples.")
Run Code Online (Sandbox Code Playgroud)