2013-04-16 3 views
0

Je n'arrive pas à combiner deux éléments d'une liste en un seul élément.Combiner les éléments de liste dans Common Lisp (Clisp)

Par exemple:

'(Ben Hofferber) => '(Ben_Hofferber) or '(Ben-Hofferber) 

Toutes les idées sur la façon dont cela peut être réalisé?

J'ai été déconner avec des fonctions d'impression en essayant de le faire fonctionner sans succès.J'ai besoin de combiner et séparer ces éléments afin que je puisse les utiliser comme des clés pour une liste.

+0

Vous devez spécifier ce que les éléments de la liste pourraient être et ce que vous entendez par "combiner". Par exemple, comment voulez-vous combiner deux symboles de différents paquets? – sds

+0

Fondamentalement, je veux combiner des données à partir de deux éléments dans une liste à un élément. donc de '(Ben Hofferber) à' (Ben_Hofferber) où cdr reviendra à zéro au lieu de Hofferber. – Hoffination

+0

Vous n'avez pas répondu à ma question: comment voulez-vous combiner le symbole cl: voiture avec le symbole cl-user :: Ben? – sds

Répondre

0

Vous pouvez également utiliser des listes comme clés alist. Par exemple,

(assoc '(1 2) '(((1 1) a) ((1 2) b) ((1 3) c)) :test #'equal) 
==> ((1 2) B) 

Donc, si vous avez une liste de personnes

(defparameter *people* '((Ben Hofferber) (Adam Young))) 

vous pouvez définir leur âge comme ceci:

(defparameter *ages* (mapcar #'list *people* '(20 11))) 

et les trouver comme ceci:

(assoc '(Ben Hofferber) *ages* :test #'equal) 
==> ((BEN HOFFERBER) 20) 

Si, cependant, vous insi En combinant des symboles en un, vous devrez expliquer comment vous voulez faire cela.

Si les deux symboles sont dans le même paquet, les symboles combinés peuvent être placés là aussi:

(defun combine-symbols (s1 s2) 
    (intern (concatenate 'string (symbol-name s1) "-" (symbol-name s2)) 
      (symbol-package s1))) 

mais si elles sont dans des emballages différents (par exemple, cl:car et cl-user::ben), vous auriez à faire choix difficile quel paquet aller avec.

Vous pouvez aller avec des cordes et utiliser

(defun combine-objects (o1 o2) 
    (format nil "~A-~A" o1 o2)) 

Ne pas oublier de passer :test #'equal ou :test #'string= à assoc.

Questions connexes