Применить формат к сглаженному списку аргументов, не удаляя nil или элементы подсписка - PullRequest
0 голосов
/ 07 марта 2020

У меня есть строка формата с 11 "% s", например,

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

, и я хотел бы применить format к этой строке и результаты (syntax-ppss), которые могут выглядеть примерно так, например. смесь чисел, ноль, т, подсписки, ie. различные предметы. Формат "% 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))))

Это кажется слишком сложным, я надеялся на более простое решение, если оно есть?

1 Ответ

1 голос
/ 07 марта 2020

Вместо того, чтобы форматировать весь результат списка syntax-ppss сразу, вы можете использовать mapconcat для форматирования каждого элемента списка и объединения форматированных строк вместе с пробелом-разделителем:

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

Основное различие между этим и вашим исходным решением заключается в том, что в этом результате нет пробела. Если вы хотите сохранить его, используйте пустой разделитель и введите вместо него пробел в строке format:

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

РЕДАКТИРОВАТЬ: Если вы предпочитаете оставить один format вызов, еще одной альтернативой является apply результат списка syntax-ppss в качестве аргументов format:

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