2017-08-01 6 views
2

Mon code est comme ceci:Emacs Lisp: créer une liste en utilisant citation dans la portée locale (par exemple, la portée de la fonction)

(defun test() "Test." 
    (setq lista '(A)) 
    (push 'B lista) 
    (nreverse lista)) 

(message "%s" (test)) ; Output is (A B) 
(message "%s" (test)) ; Output is (B A B) 

Il semble étrange parce que je pense que le résultat soit

(A B) 
(A B) 

Si je remplacer (setq lista '(A)) avec (setq lista (list 'A)), je reçois le résultat attendu. Je pense que les méthodes de création de liste font la différence mais je ne connais pas les détails.

Ma version emacs est GNU Emacs 24.5.1

+0

Votre question a déjà une réponse: 'quote' ne pas * créer * quoi que ce soit, il ne vous permet de faire référence à une valeur hardcoded dans le code. – Stefan

Répondre

3

Vous faites ceci:

(defvar t1 '(A)) 
(defun test() 
    "Test." 
    (setq lista t1) 
    (push 'B lista) 
    (nreverse lista)) 

Vous modifiez une cellule de contre qui fait partie du code: après le premier appel, t1 devient '(A B).

l'éviter en utilisant (list) au lieu de (quote):

(defun test() 
    "Test." 
    (setq lista (list 'A)) 
    (push 'B lista) 
    (nreverse lista)) 
+0

Cela semble raisonnable. Donc vous voulez dire que elisp créera une variable temporaire lors de la création d'une liste en utilisant une expression de citation dans une portée locale, mais cela ne se produit pas dans une portée globale. Pourquoi elisp les rend différents parce que c'est un peu déroutant. – hw9527

+0

La variable temporaire est créée par le lecteur chaque fois qu'il rencontre un devis. Ce n'est pas tout à fait temporaire cependant: cela fait partie de la définition de la fonction. Ainsi, lorsque vous exécutez la fonction, vous modifiez la définition de votre fonction. –