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.
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.
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.
interpolation
balise.format
indicateur pour cela (à utiliserM-x report-emacs-bug
pour cela). Les autres d'entre nous se sont habitués à l'utiliserconcat
pour cela, parfois en combinaison avecformat
(pour d'autres conversions). Ou bien en passant un argument àformat
tel que(if something "foobar" "")
, correspondant à l'format
indicateur"%s"
.rx
macro dans un tel scénario. Assurez-vous au minimum que vous êtesregexp-quote
approprié), 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"
,concat
cela a plus de sens.Réponses:
Selon votre application,
concat
peut être utile:Cela fonctionne car concat agit sur les séquences et nil est une liste vide.
la source
Le formulaire spécial
or
est 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 estfoo
, ce qui suit fera ce que vous voulez:À certains égards, c'est mieux qu'une balise magique car elle indique clairement quelle valeur doit être renvoyée si l'argument est nul.
la source