Ce qui suit ne fonctionne évidemment pas et d'où cette question.
Comment puis-je corriger le code ci-dessous pour que la valeur de somelist
devienne '(("abc" . 123))
?
(setq x "abc")
(setq y 123)
(setq somelist nil)
(add-to-list 'somelist '(x . y))
`(,x . ,y)
.(add-to-list 'somelist '(,x . ,y))
mais j'ai oublié la citation.Réponses:
La question générale est que vous avez besoin
x
ety
à évaluer avant qu'ils ne soient insérés danssomelist
. Le problème avec la liste citée (avec'
comme syntaxe de lecteur) est qu'ilquote
s'agit d'un formulaire spécial qui n'évalue pas son argument. Selon le docstring:Par conséquent, vous devez soit ajouter des guillemets, soit utiliser une fonction qui évalue les arguments.
Le backquoting vous permet d'évaluer sélectivement les éléments d'une liste backquoted avec la
,
syntaxe:Alternativement, vous pouvez utiliser
cons
(comme @tarsius suggère dans sa réponse) ou, pour un nombre arbitraire d'éléments,list
:Le choix dépend de ce que vous devez faire avec les éléments.
la source
Ne citez pas la cellule contre, car les expressions entre guillemets ne sont pas évaluées. C'est exactement pourquoi on cite - pour empêcher l'évaluation. Mais ce n'est pas ce que vous voulez, alors ne le faites pas.
Utilisez plutôt le formulaire qui crée une cellule contre à partir de deux valeurs évaluées, ses arguments.
Bien sûr, vous pouvez également quasiquote mais cela n'a pas vraiment de sens ici, et semble pire. Utilisez uniquement
`
et,
lorsque cela améliore la lisibilité, c'est-à-dire lorsque vous faites quelque chose de plus complexe que de construire une contre-cellule ou d'ajouter un atome ou une liste au début d'une liste existante.En utilisant des quasiquotes, cela ressemblerait à ceci:
Ce qui est pire car il utilise une syntaxe supplémentaire qui n'est pas du tout requise dans ce cas et obscurcit celle qui
cons
est utilisée.la source
cons
ing. Les quasiquotes me semblent concerner davantage le contrôle fin du contenu de la liste que la lisibilité, mais je conviens que le cas d'utilisation est logiquecons
.cons
,list
etnconc
. Sauf que c'est plus joli. C'est du sucre syntaxique qui est utile lorsque vous avez besoin d'un "contrôle fin du contenu de la liste" (comme dans "faire quelque chose de plus complexe que d'ajouter un atome ou une liste au début"). Et l'avantage supplémentaire d'utiliser ce sucre syntaxique est: la lisibilité. Le quasiquoting ne vous donne pas un contrôle supplémentaire plus fin - il vous permet simplement de faire la même chose avec moins de bogues lors de la tentative initiale. :-)