2016-02-28 1 views
0

J'ai une situation comme ça dans mon code:Comment interpréter un paramètre de liste comme une liste réelle, pas comme un symbole?

(defparameter names (list "Alice" "John" "Jack")) 
(defparameter pair '(:smt names)) 

(defun process (a-list) (first a-list)) 

Maintenant (process names) fonctionne très bien, mais (process (second pair)) renvoie une erreur (ne peut pas prendre la voiture de noms). Quand je débogue, j'ai remarqué que pour le dernier appel le paramètre est considéré comme un symbole par type-of, pas une liste de valeurs (listp renvoie nil). Comment puis-je surmonter cela ou qu'est-ce que je fais de mal? Est-ce que (second pair) n'est pas la même chose que names?

Répondre

1

Il est très facile de vérifier si (second pair) est identique à names dans votre REPL.

CL-USER> (second pair) 
NAMES 
CL-USER> names 
("Alice" "John" "Jack") 
CL-USER> 'names 
NAMES 
CL-USER> (second (list ':smt names)) 
("Alice" "John" "Jack") 
CL-USER> (second (list ':smt 'names)) 
NAMES 

Vous pouvez voir que c'est la même chose que 'names; pair est une liste de deux symboles.

Il est possible que vous souhaitez utiliser et évaluer quasiquotenames au lieu de le citer:

CL-USER> (second `(:smt ,names)) 
("Alice" "John" "Jack") 
+0

Merci. Cela fonctionne bien sûr. Je ne pensais pas que la citation extérieure affectait la conversion des «noms» des symboles en leurs valeurs réelles. J'essaie toujours de m'habituer à LISP je suppose. – pembeci