Interpolar argumento nulo a `format` como la cadena vacía?

9

Entiendo que esto es trivial con un if, pero ¿hay una opción, like %So %sque interpola nil como ninguna cadena?

Ejemplo:

(format "%?.el" nil) ; ".el"
(format "%?.el" "beginner") ; "beginner.el"
El gato no divertido
fuente
PD. solicitando interpolationetiqueta.
The Unfun Cat
1
Sí, la interpolación de cadenas es el término correcto para usar. Es una variación sobre el tema de las comillas / macros, donde las cadenas se generan usando plantillas.
wvxvw
1
Es una buena pregunta Considere solicitar un formatindicador para esto (usar M-x report-emacs-bugpara eso). El resto de nosotros nos hemos acostumbrado a usar concatesto, a veces en combinación con format(para otras conversiones). O bien, pasar un argumento a formatcomo (if something "foobar" ""), correspondiente al formatindicador "%s".
Drew
2
FYI: acabo de presentar una solicitud de mejora (n. ° 19975), por lo que no es necesario. (Debería haber hecho eso hace años.)
Drew
1
Eso suena como una forma bastante dudosa de construir una expresión regular (tal vez considere usar la rxmacro en tal escenario. Como mínimo, asegúrese de que sea regexp-quoteapropiado), pero aparte de eso, si tiene una gran cantidad de cadenas en la LISTA, podría siempre hacer algo así (apply 'format "%s%s%s%s" (mapcar (lambda (x) (or x "")) LIST)). Por supuesto, si su cadena de formato es literalmente similar "%s%s%s", entonces concattiene más sentido.
phils

Respuestas:

8

Dependiendo de su aplicación, concatpodría ser útil:

(concat "live long " nil "and prosper")
;; => "live long and prosper"

Esto funciona porque concat actúa sobre secuencias y nil es una lista vacía.

Malabarba
fuente
6

La forma especial ores útil aquí. Esta macro devuelve el valor del primer argumento, a menos que sea nulo, en cuyo caso devuelve el segundo. Entonces, suponiendo que la variable que desea verificar es foo, lo siguiente hará lo que quiera:

(format "%s.el" (or foo ""))

De alguna manera, es mejor que una etiqueta mágica, ya que deja en claro qué valor debe devolverse si el argumento es nulo.

Elias Mårtenson
fuente
1
Una pequeña cosa: o no es una macro
Malabarba
1
Lo suficientemente justo. Sin embargo, el punto importante aquí es que no es una función (es decir, está en cortocircuito). Mi ejemplo es lo suficientemente largo como para que no haga ninguna diferencia, pero si el segundo argumento tiene efectos secundarios, es diferente.
Elias Mårtenson
Sí, es una forma especial. :-)
Malabarba