Interpoler l'argument nil pour `formater 'comme chaîne vide?


9

Je comprends que c'est trivial avec un if, mais y a-t-il une option, comme %Sou %squi interpole nil comme pas de chaîne du tout?

Exemple:

(format "%?.el" nil) ; ".el"
(format "%?.el" "beginner") ; "beginner.el"

Ps. demande de interpolationbalise.
The Unfun Cat

1
Oui, l'interpolation de chaînes est le bon terme à utiliser. C'est une variation sur le sujet des citations / macros, où les chaînes sont générées à l'aide de modèles.
wvxvw

1
C'est une bonne question. Pensez à demander un formatindicateur pour cela (à utiliser M-x report-emacs-bugpour cela). Les autres d'entre nous se sont habitués à l'utiliser concatpour cela, parfois en combinaison avec format(pour d'autres conversions). Ou bien en passant un argument à formattel que (if something "foobar" ""), correspondant à l' formatindicateur "%s".
Drew

2
Pour info - Je viens de déposer une telle demande d'amélioration (# 19975), vous n'avez donc pas besoin de le faire. (Cela aurait dû être fait il y a des années.)
Drew

1
Cela ressemble à une façon assez douteuse de construire une expression rationnelle (peut-être envisagez d'utiliser la rxmacro dans un tel scénario. Assurez-vous au minimum que vous êtes regexp-quoteapproprié), mais cela mis à part si vous avez un grand nombre de chaînes peut-être dans LIST, vous pourriez faites toujours quelque chose comme (apply 'format "%s%s%s%s" (mapcar (lambda (x) (or x "")) LIST)). Bien sûr, si votre chaîne de formatage est littéralement semblable "%s%s%s", concatcela a plus de sens.
phils

Réponses:


8

Selon votre application, concatpeut être utile:

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

Cela fonctionne car concat agit sur les séquences et nil est une liste vide.


6

Le formulaire spécial orest utile ici. Cette macro renvoie la valeur du premier argument, sauf si elle est nulle, auquel cas elle renvoie le second. Donc, en supposant que la variable que vous souhaitez vérifier est foo, ce qui suit fera ce que vous voulez:

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

À certains égards, c'est mieux qu'une balise magique car elle indique clairement quelle valeur doit être renvoyée si l'argument est nul.


1
Une petite chose: ou n'est pas une macro
Malabarba

1
C'est suffisant. Le point important ici est que ce n'est pas une fonction (c'est-à-dire qu'il s'agit d'un court-circuit). Mon exemple est suffisamment simple pour que cela ne fasse aucune différence, mais si le deuxième argument a des effets secondaires, c'est différent.
Elias Mårtenson

Oui, c'est une forme spéciale. :-)
Malabarba
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.