Interpolar argumento nulo para `format` como a string vazia?

9

Eu entendo que isso é trivial com um if, mas existe uma opção, como %Sou %sque interpola nada como nenhuma string?

Exemplo:

(format "%?.el" nil) ; ".el"
(format "%?.el" "beginner") ; "beginner.el"
The Unfun Cat
fonte
Ps. solicitando interpolationtag.
The Unfun Cat
1
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.

Malabarba
fonte
6

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.

Elias Mårtenson
fonte
1
Uma pequena coisa: ou não é uma macro
Malabarba
1
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.
Elias Mårtenson
Sim, é uma forma especial. :-)
Malabarba