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

Lisp 将格式应用于展开参数列表,而不删除nil或子列表元素,lisp,eval,string-formatting,elisp,quote,Lisp,Eval,String Formatting,Elisp,Quote,我有一个带有11个“%s”的格式字符串,例如 并且希望将格式应用于此字符串和(语法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 "

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

并且希望将
格式
应用于此字符串和
(语法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
格式化列表的每个元素,并使用分隔符将格式化的字符串连接在一起,而不是一次格式化
语法ppss

(mapconcat (lambda (it) (format "%s" it)) (syntax-ppss) " ")
此解决方案与原始解决方案之间的主要区别在于,此结果中没有尾随空格。如果要保留它,请使用空分隔符,并将空格改为
格式
字符串:

(mapconcat (lambda (it) (format "%s " it)) (syntax-ppss) "")
编辑:如果您希望保留单个
格式
调用,另一种选择是
应用
语法ppss的列表结果
作为
格式
的参数:

(apply 'format "%s %s %s %s %s %s %s %s %s %s %s " (syntax-ppss))

你的问题的主题行包含了它自己的答案:
(应用#格式…
@tfb是的,我以为我做了20分钟,然后又像amTitle中的4一样误导;在被接受的答案中没有任何平坦化(无论是否删除
nil
),是的,我会把它作为一个愚蠢的问题删除,但是Steve很乐意花时间回答-我想当时我确信嵌套列表导致了我的问题,所以我需要在不删除
nil
elements@Kaz现在来看,这个问题根本没有意义,一个扁平化的列表会是什么样的列表来维护它的所有子列表!?
(apply 'format "%s %s %s %s %s %s %s %s %s %s %s " (syntax-ppss))