2009-12-09 24 views
1

J'essaye de faire une fonction pour obtenir un delta entre les tableaux, mais maintenant je veux juste faire un sous-ensemble: obtenir le Nième élément.Comment faire une liste de tableaux, pas leurs symboles, en Lisp?

(defvar p1 #(1 2)) 
(defvar p2 #(3 4)) 
(mapcar '(lambda (x) (aref x 0)) '(p1 p2)) 

debugger invoked on a TYPE-ERROR in ... 
    The value P1 is not of type ARRAY. 

La même erreur si je le fais avec make-array. Comment appliquer la fonction lambda ou comment appliquer (aref x 0) ou (aref x N) dans le cas général? Finalement, je veux faire une fonction qui retourne un delta: p2 - p1.

+0

le titre de cette question est faux. Le problème ne concerne pas l'obtention d'éléments dans des tableaux, mais la création d'une liste de tableaux au lieu d'un symbole de liste. –

Répondre

3

MAPCAR prend une fonction en tant que premier argument. '(lambda (x) (aref x 0)) est la même que (quote (lambda (x) (aref x 0))), et ceci est pas une fonction. Vous voulez en faire une fonction avec (function (lambda (x) (aref x 0))), qui peut être écrit plus court que #'(lambda (x) (aref x 0)), ou même (à cause d'une macro standard) (lambda (x) (aref x 0)).

'(p1 p2) est la même que (quote (p1 p2)). QUOTE signifie que les arguments sont non évalué, donc les noms "P1" et "P2" représentent eux-mêmes, pas leurs valeurs. L'erreur de type que vous obtenez est que le symbole 'P1 n'est pas un tableau, il a juste un tableau en tant que valeur. Pour obtenir une liste des valeurs, utilisez LISTE: (list p1 p2).

En conclusion: (mapcar #'(lambda (x) (aref x 0)) (list p1 p2))

EDIT: Pour la soustraction des vecteurs, vous devriez regarder dans la fonction MAP; notez que vous pouvez fournir plusieurs séquences.

+0

Cela répond au problème superficiel sans aborder le but ultime d'obtenir le delta. – Xach

+0

xach, j'ai donné un indice dans le dernier paragraphe. – Svante

1

Je pense que le problème est que vous avez cité la liste, à savoir

'(p1 p2) 

Vous devriez plutôt avoir

(list p1 p2) 

parce que dans votre programme que vous essayez d'appliquer effectivement mapcar à une liste contenant deux éléments, le symbole p1 et le symbole p2.

0

antti.huima a raison. Cependant, il y a une autre erreur dans votre code:

(mapcar #'(lambda (x) (aref x 0)) (list p1 p2)) 

Notez la marque de hachage avant la seule citation qui précède le lambda.

-2

Si vous le souhaitez, vous pouvez utiliser SYMBOLE VALEUR:

(defvar p1 #(1 2)) 
(defvar p2 #(3 4)) 
(mapcar #'(lambda (x) (aref (symbol-value x) 0)) '(p1 p2)) 
+2

Cela ne fonctionnera que pour les valeurs globales. – Xach

3

Pour obtenir un vecteur delta contenant la différence entre deux vecteurs, essayez ceci:

(map 'vector #'- p2 p1) 

Dans votre exemple, retourne:

#(2 2) 
+0

C'est ce que j'ai laissé entendre. – Svante

+0

un point de moi vous rapproche du badge –