Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Creation dymanique d'une "a-list"

3 réponses
Avatar
syl.roy
Bonjour,

Je debute en elisp et j'ai un peu de mal sur les a-lists (ref http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node153.html) dont j'ai besoin pour utiliser bindat.el.

Voici une a-list que je defini:

(setq myalist '((a . 1)
(b . 2)
(c . (+ 2 3))))

Le probleme, c'est qu'en l'evaluant, j'ai :

((a . 1) (b . 2) (c + 2 3))

Alors que ce que je voudrais, c'est :

((a . 1) (b . 2) (c 5))

Un peu etonnant... Je dois rater quelque chose de gros.
Merci de votre aide !

3 réponses

Avatar
Nicolas Richard
writes:

Bonjour,

Je debute en elisp et j'ai un peu de mal sur les a-lists (ref
http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node153.html) dont j'ai
besoin pour utiliser bindat.el.

Voici une a-list que je defini:

(setq myalist '((a . 1)
(b . 2)
(c . (+ 2 3))))



Le signe ' (single quote) indique que la suite est "quotée",
c'est-à-dire simplement lue sans être évaluée, et une liste est
retournée.

Si tu veux évaluer des morceaux, tu peux faire ceci :
(setq myalist `((a . 1)
(b . 2)
(c . ,(+ 2 3))))
le signe ` (backquote) est une macro qui agit comme une quote, sauf
lorsqu'une virgule apparait. Voir (info "(elisp) Backquote")

Tu peux aussi explicitement construire la liste~:
(setq myalist (list (cons 'a 1) (cons 'b 2) (cons 'c (+ 2 3))))

--
Nico.
Avatar
syl.roy
Merci !

Le couple backquote/virgule fait mon bonheur !

J'avais fini par trouver une troisieme solution en construisant tout explicitement avec des "acons". Mais c'est beaucoup moins joli que tes solutions:

(setq myalist
(acons 'a 1
(acons 'b 2
(acons 'b 3
nil))))

Merci encore !
Avatar
jack-mac
Tu peux aussi faire des trucs comme:
(setq myalist
(list
'(a . 1)
(cons 'b 2) ; equivalent ligne precedente
(cons 'c (+ 2 3))))

(ça ressemble d'ailleurs à ce que génère la macro backquote)