Sim, interpolação de string é o termo certo a ser usado. É uma variação sobre o assunto entre aspas / macros, onde as strings são geradas usando modelos.
Wvxvw 01/03
1
É uma boa pergunta. Considere solicitar um formatindicador para isso (use M-x report-emacs-bugpara isso). O resto de nós já se acostumou a usar concatisso, às vezes em combinação com format(para outras conversões). Ou então passar um argumento para format, como (if something "foobar" "")correspondente ao formatindicador "%s".
Tirou
2
FYI - Acabei de enviar uma solicitação de aprimoramento (# 19975), para que você não precise. (Deveria ter feito isso anos atrás).
Drew
1
Isso soa como uma maneira bastante duvidosa de criar uma regexp (talvez considere usar a rxmacro nesse cenário. No mínimo, verifique se você está usando o regexp-quoteapropriado), mas, se você tiver um grande número de strings talvez na LIST, poderá sempre faça algo parecido (apply 'format "%s%s%s%s" (mapcar (lambda (x) (or x "")) LIST)). Obviamente, se sua string de formatação é literalmente semelhante "%s%s%s", então concatfaz mais sentido.
phils
Respostas:
8
Dependendo do seu aplicativo, concatpode ser útil:
(concat "live long " nil "and prosper")
;; => "live long and prosper"
Isso funciona porque concat atua em seqüências e nil é uma lista vazia.
O formulário especial oré útil aqui. Essa macro retorna o valor do primeiro argumento, a menos que seja nulo e, nesse caso, retorna o segundo. Portanto, supondo que a variável que você deseja verificar seja foo, o seguinte fará o que você deseja:
(format "%s.el" (or foo ""))
De certa forma, é melhor que uma tag mágica, pois deixa claro qual valor deve ser retornado se o argumento for nulo.
Justo. O ponto importante aqui é que não é uma função (ou seja, está em curto-circuito). Meu exemplo é suficiente para que não faça diferença, mas se o segundo argumento tiver efeitos colaterais, será diferente.
interpolation
tag.format
indicador para isso (useM-x report-emacs-bug
para isso). O resto de nós já se acostumou a usarconcat
isso, às vezes em combinação comformat
(para outras conversões). Ou então passar um argumento paraformat
, como(if something "foobar" "")
correspondente aoformat
indicador"%s"
.rx
macro nesse cenário. No mínimo, verifique se você está usando oregexp-quote
apropriado), mas, se você tiver um grande número de strings talvez na LIST, poderá sempre faça algo parecido(apply 'format "%s%s%s%s" (mapcar (lambda (x) (or x "")) LIST))
. Obviamente, se sua string de formatação é literalmente semelhante"%s%s%s"
, entãoconcat
faz mais sentido.Respostas:
Dependendo do seu aplicativo,
concat
pode ser útil:Isso funciona porque concat atua em seqüências e nil é uma lista vazia.
fonte
O formulário especial
or
é útil aqui. Essa macro retorna o valor do primeiro argumento, a menos que seja nulo e, nesse caso, retorna o segundo. Portanto, supondo que a variável que você deseja verificar sejafoo
, o seguinte fará o que você deseja:De certa forma, é melhor que uma tag mágica, pois deixa claro qual valor deve ser retornado se o argumento for nulo.
fonte