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.
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.
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.
interpolation
etiqueta.format
indicador para esto (usarM-x report-emacs-bug
para eso). El resto de nosotros nos hemos acostumbrado a usarconcat
esto, a veces en combinación conformat
(para otras conversiones). O bien, pasar un argumento aformat
como(if something "foobar" "")
, correspondiente alformat
indicador"%s"
.rx
macro en tal escenario. Como mínimo, asegúrese de que searegexp-quote
apropiado), 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"
, entoncesconcat
tiene más sentido.Respuestas:
Dependiendo de su aplicación,
concat
podría ser útil:Esto funciona porque concat actúa sobre secuencias y nil es una lista vacía.
fuente
La forma especial
or
es ú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 esfoo
, lo siguiente hará lo que quiera:De alguna manera, es mejor que una etiqueta mágica, ya que deja en claro qué valor debe devolverse si el argumento es nulo.
fuente