Domanda

Sto cercando di creare una funzione per ottenere un delta tra gli array, ma in questo momento voglio solo creare un sottoinsieme:ottieni l'ennesimo elemento.

 (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.

Lo stesso errore se lo faccio con make-array.

Come applico la funzione lambda o come applicarla (aref x 0), O (aref x N) in generale?

Alla fine voglio creare una funzione che restituisca un delta:p2 - p1.

È stato utile?

Soluzione

mapcar prende una funzione come primo argomento. '(lambda (x) (aref x 0)) è la stessa di (quote (lambda (x) (aref x 0))), e questo è non una funzione. Si vuole rendere una funzione con (function (lambda (x) (aref x 0))), che può essere scritto più breve come #'(lambda (x) (aref x 0)), o anche (a causa di una macro standard) (lambda (x) (aref x 0)).

'(p1 p2) è lo stesso di (quote (p1 p2)). QUOTE significa che gli argomenti sono Non valutato , in modo che i nomi "P1" e "P2" si distinguono per se stessi, non per i loro valori. L'errore tipo che si ottiene è che la 'P1 simbolo non è un array, ha solo un array come valore. Al fine di ottenere un elenco dei valori, l'uso LIST:. (list p1 p2)

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

EDIT: Per sottrarre vettori, si dovrebbe esaminare le href="http://www.lispworks.com/documentation/lw50/CLHS/Body/f_map.htm" funzione; notare che è possibile fornire più sequenze.

Altri suggerimenti

Per ottenere un vettore Delta contenente la differenza tra due vettori, provate questo:

(map 'vector #'- p2 p1)

Nel tuo esempio, restituisce:

#(2 2)

Credo che il problema è che hai citato la lista, cioè.

'(p1 p2)

Si dovrebbe invece avere

(list p1 p2)

perché nel programma che in realtà tenta di applicare mapcar ad una lista che contiene due elementi, il simbolo e p1 p2 simbolo.

antti.huima ha ragione.Tuttavia, c'è un altro errore nel tuo codice:

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

Nota il cancelletto prima della virgoletta singola che precede il lambda.

Se si desidera, è possibile utilizzare SIMBOLO VALORE:

(defvar p1 #(1 2))
(defvar p2 #(3 4))
(mapcar #'(lambda (x) (aref (symbol-value x) 0)) '(p1 p2))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top