2009-11-02 6 views
22

Ceci est probablement stupide mais je n'ai pas assez de connaissances Elisp pour comprendre ce qui se passe en ce qui concerne la citation et l'évaluation.Emacs Lisp: évaluer la variable dans alist

Supposons que j'ai ce code Elisp:

(add-to-list 'default-frame-alist '(width . 100)) 
(add-to-list 'default-frame-alist '(height . 50)) 

Il se traduira par la valeur par défaut-frame-alist prévu:

((height 50) 
(width 100)) 

Mais maintenant, si j'ai ceci:

(setq my-frame-width 100) 
(setq my-frame-height 50) 
(add-to-list 'default-frame-alist '(width . my-frame-width)) 
(add-to-list 'default-frame-alist '(height . my-frame-height)) 

Il en résulte -

((height my-frame-height) 
(width my-frame-width)) 

et, à en juger par la géométrie de la trame, n'évalue jamais ces variables. Comment puis-je faire apparaître les valeurs réelles de my-frame-width et height dans cet alist? Est-ce que j'ai trop de citations? Mais je ne peux pas enlever des évaluations add-to-list ...

Répondre

28

Essayez ceci:

(setq my-frame-width 100) 
(setq my-frame-height 50) 
(add-to-list 'default-frame-alist `(width . ,my-frame-width)) 
(add-to-list 'default-frame-alist `(height . ,my-frame-height)) 

En utilisant backquote au lieu de devis vous permet d'utiliser, pour forcer l'évaluation d'un paramètre.

Voir le manuel de référence Elisp. Tapez C-x info, recherchez le manuel de référence elisp, puis recherchez backquote dans celui-ci.

+0

Exactement ce que je cherchais, merci! Des questions comme celle-ci me rappellent que je devrais prendre le temps d'apprendre élisp systématiquement. –

+0

Voir aussi [Emacs lisp évaluer variable dans alist] (http://stackoverflow.com/questions/15485833/emacs-lisp-evaluate-variable-in-alist) pour un problème similaire .. –

+3

J'aime l'évidence intuitive de la chose de retour-et-virgule. – Cheeso

11

Comme une alternative à l'opérateur de retour en arrière dans la réponse mch, vous pouvez utiliser la fonction cons. Cette fonction va construire une contre-cellule avec le premier argument comme voiture et le second argument comme son cdr. La notation de paire en pointillés dans votre code est un raccourci pour cela. Donc, on pourrait réécrire votre code de cette façon:

(setq my-frame-width 100) 
(setq my-frame-height 50) 
(add-to-list 'default-frame-alist (cons 'width my-frame-width)) 
(add-to-list 'default-frame-alist (cons 'height my-frame-height)) 

De cette façon, vous pouvez citer les symboles que vous souhaitez voir apparaître littéralement (comme la largeur et la hauteur) et d'évaluer les symboles dont les valeurs dont vous avez besoin (comme mon cadre de largeur et my-frame-height). Je préfère cette méthode parce qu'elle est plus simple. Cependant, c'est certainement une question d'opinion. Voici encore plus information on cons and list pour référence future.

Questions connexes