Мне часто приходится делать несколько замен одной и той же строки:
(format "%s %s %s" "a" "a" "a") ;; gives: "a a a"
(это просто фиктивный пример, в этом случае лучше склеить «а» с пробелом, но в целом я имею дело с более сложными ситуациями)
Есть ли способ сделать именную замену? Например, в Python можно написать:
"{0} {0} {0}".format("a") # or:
"{name} {name} {name}".format(name="a")
Ответы:
Переписывание этого ответа дает другое решение:
Изменить : еще одно
format-spec
решениеКак Малабарба дает другое решение в комментариях:
Изменить 2 : Оценка до замены:
Вот примеры с оценкой перед заменой:
источник
format-spec-make
это просто alist:'((?a . "a") (?b . "b"))
Библиотека манипуляций со строками Магнара Свена s.el предоставляет множество способов сделать это. Например:
Обратите внимание , что
s-format
можно взять любую функцию заменителя, но обеспечивает специальную обработку дляaget
,elt
иgethash
. Таким образом, вы можете использовать список токенов и ссылаться на них по индексу, например так:Вы также можете заменить, используя переменные в области видимости, например так:
источник
s-lex-формат s.el - это действительно то, что вам нужно, но если вы действительно хотите поместить код внутри блоков подстановки, а не просто в имена переменных, я написал это в качестве доказательства концепции.
Вы даже можете вставить
fmt
звонок внутри другого,fmt
если вы сумасшедшийКод просто расширяется до
format
вызова, поэтому все замены выполняются по порядку и оцениваются во время выполнения.Улучшения могут быть сделаны с тем, какой тип формата используется вместо того, чтобы всегда использовать% s, но это должно было бы быть сделано во время выполнения и добавило бы накладные расходы, но могло бы быть сделано, окружая все аргументы форматирования в вызове функции, которая хорошо форматирует вещи, хорошо основанные по типу, но на самом деле единственный сценарий, в котором вы захотите, это, вероятно, float, и вы могли бы даже сделать (формат "% f" float) в замене, если вы были в отчаянии.
Если я над этим больше работаю, я скорее обновлю эту суть, чем этот ответ. https://gist.github.com/jordonbiondo/c4e22b4289be130bc59b
источник
Не универсальный, но решит ваше дело:
Используя приведенный пример:
дает:
источник
" * - :raw-html:`<img width=\"100%%\" src=\"http://xxx.xxx/images/languages/staff/%s.jpg\" alt=\"%s.jpg\"/>` - .. _%s:"
- все%s
одинаковые.