将格式应用于展平参数列表而不删除 nil 或子列表元素

Apply format to flattened argument list without removing nil, or sublist elements

我有一个包含 11 个“%s”的格式字符串,例如

"%s %s %s %s %s %s %s %s %s %s %s "

并希望将 format 应用于此字符串和 (syntax-ppss) 的结果,这可能看起来像这样,例如。数字、nil、t、子列表的混合,即。各种对象。根据文档,“%s”格式应该能够打印任何对象

(3 1163 1171 nil nil nil 0 nil nil (1144 1153 1163) nil)

我认为这很容易,但我唯一能想到的就是引用列表中的每个元素然后 eval 就这样,

(eval
 `(format "%s %s %s %s %s %s %s %s %s %s %s "
          ,@(mapcar (lambda (it) (list 'quote it)) (syntax-ppss))))

这看起来太复杂了,我希望有一个更简单的解决方案,如果有的话?

您可以使用 mapconcat 来格式化列表的每个元素,然后使用分隔符 space 将格式化的字符串连接在一起,而不是立即格式化 syntax-ppss 的整个列表结果:

(mapconcat (lambda (it) (format "%s" it)) (syntax-ppss) " ")

此解决方案与您的原始解决方案之间的主要区别在于此结果中没有尾随 space。如果要保留它,请使用空分隔符并将 space 放在 format 字符串中:

(mapconcat (lambda (it) (format "%s " it)) (syntax-ppss) "")

编辑: 如果您希望保留单个 format 调用,另一种选择是 apply [=13 的列表结果=] 成为 format:

的参数
(apply 'format "%s %s %s %s %s %s %s %s %s %s %s " (syntax-ppss))