Lisp format中~:{指令下^符号失效的原因及解决方法
Common Lisp Format 中~:{指令的分隔符失效问题
先看能正常生成分隔符的用法:
(format nil "~{~a~^,~}" '(1 2 3)) ; => "1,2,3" (format nil "~{~a=~a~^,~}" '(a 1 b 2 c 3)) ; => "A=1,B=2,C=3"
但用~:{迭代子列表时,~^没生成预期的逗号:
(format nil "~:{~a=~a~^,~}" '((a 1) (b 2) (c 3))) ; => "A=1B=2C=3"
原因
~^的逻辑是:只有当后面还有待处理的格式元素时,才输出当前分隔符。在~:{~a=~a~^,~}这个格式串里,~^被放在了~:{的内部格式块(~a=~a)里,每次迭代处理一个子列表时,~a=~a会消耗掉子列表里的两个元素,处理完后当前子列表已经没有剩余元素,~^判断后面没有更多要处理的元素,自然不会输出逗号。
简单说:~^现在作用的是单个子列表内部的元素分隔,但每个子列表只有两个元素,处理完就没了,根本触发不了分隔符;而我们需要的是子列表之间的分隔。
解决办法
把~^移到~:{的外部,让它作用在子列表的迭代循环之间:
(format nil "~{~:{~a=~a~}~^,~}" '((a 1) (b 2) (c 3))) ; => "A=1,B=2,C=3"
这里的结构是:外层~{...~}迭代整个子列表集合,内层~:{~a=~a~}处理单个子列表的键值对,~^,则在每处理完一个子列表后,判断是否还有下一个子列表,有就输出逗号分隔。
内容的提问来源于stack exchange,提问作者ceving
相关产品推荐
相关产品推荐

