Często muszę dokonać kilku podstawień tego samego ciągu:
(format "%s %s %s" "a" "a" "a") ;; gives: "a a a"
(to tylko fikcyjny przykład, w tym przypadku lepiej przykleić „a” spacją, ale ogólnie mam do czynienia z bardziej skomplikowanymi sytuacjami)
Czy istnieje sposób dokonania nazwanego podstawienia? Na przykład w pythonie można by napisać:
"{0} {0} {0}".format("a") # or:
"{name} {name} {name}".format(name="a")
Odpowiedzi:
Ponowne napisanie tej odpowiedzi daje inne rozwiązanie:
Edycja : inne
format-spec
rozwiązaniePonieważ Malabarba podaje inne rozwiązanie w komentarzach:
Edycja 2 : Ocena przed zmianą:
Oto przykłady z oceną przed zamianą:
źródło
format-spec-make
to tylko alist:'((?a . "a") (?b . "b"))
Biblioteka manipulacji ciągami Magnar Sveen s.el zapewnia wiele sposobów na zrobienie tego. Na przykład:
Należy pamiętać, że
s-format
może przyjąć dowolną funkcję zamiennika, ale zapewnia specjalnej obsługi dlaaget
,elt
igethash
. Możesz więc użyć listy tokenów i odwoływać się do nich według indeksu, tak:Można również zastąpić za pomocą zmiennych wewnątrz zakresu, takich jak to:
źródło
Format s-lex s.el jest naprawdę tym, czego chcesz, ale jeśli chcesz umieć kod wewnątrz bloków podstawienia, a nie tylko nazw zmiennych, napisałem to jako dowód koncepcji.
Możesz nawet osadzić
fmt
połączenie w innym,fmt
jeśli jesteś szalonyKod po prostu rozwija się do
format
wywołania, więc wszystkie podstawienia są wykonywane w kolejności i oceniane w czasie wykonywania.Można wprowadzić ulepszenia w tym, który typ formatu jest używany zamiast zawsze używać% s, ale musiałoby to zostać wykonane w czasie wykonywania i dodałoby narzut, ale można by to zrobić, otaczając wszystkie argumenty formatu w wywołaniu funkcji, które ładnie formatuje rzeczy ładnie oparte na typie, ale tak naprawdę jedynym scenariuszem, w którym chciałbyś tego dokonać, jest prawdopodobnie liczba zmiennoprzecinkowa i możesz nawet zrobić zmienną zmiennoprzecinkową (format „% f”) w zamianie, ponieważ byłeś zdesperowany.
Jeśli popracuję nad tym bardziej, prawdopodobnie zaktualizuję tę treść zamiast tej odpowiedzi. https://gist.github.com/jordonbiondo/c4e22b4289be130bc59b
źródło
Nie jest to cel ogólny, ale rozwiąże twoją sprawę:
Korzystając z podanego przykładu:
daje:
źródło
" * - :raw-html:`<img width=\"100%%\" src=\"http://xxx.xxx/images/languages/staff/%s.jpg\" alt=\"%s.jpg\"/>` - .. _%s:"
- wszystkie%s
są takie same.