Pregunta

Estoy tratando de hacer una función para obtener un delta entre matrices, pero en este momento sólo quiero hacer un subconjunto:. Obtener enésimo 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.

El mismo error si lo hago con maquillaje matriz.

¿Cómo se solicita la función lambda, o cómo aplicar (aref x 0) o (aref x N) en caso general?

Al final quiero hacer una función que devuelve un delta:. P2 - p1

¿Fue útil?

Solución

mapcar toma una función como primer argumento. '(lambda (x) (aref x 0)) es la misma que (quote (lambda (x) (aref x 0))), y esto es no una función. Usted quiere que sea una función con (function (lambda (x) (aref x 0))), que se puede escribir más corto como #'(lambda (x) (aref x 0)), o incluso (debido a una macro estándar) (lambda (x) (aref x 0)).

'(p1 p2) es el mismo que (quote (p1 p2)). CITA significa que los argumentos son No evaluado , por lo que los nombres de "P1" y "P2" representan a sí mismos, no por sus valores. El error de tipo que se obtiene es que el símbolo 'P1 no es una matriz, que sólo tiene una matriz como valor. Con el fin de obtener una lista de los valores, el uso LISTA:. (list p1 p2)

En conclusión: (mapcar #'(lambda (x) (aref x 0)) (list p1 p2))

EDIT: Para restar vectores, usted debe buscar en los href="http://www.lispworks.com/documentation/lw50/CLHS/Body/f_map.htm" función; en cuenta que puede proporcionar múltiples secuencias.

Otros consejos

Para obtener un vector delta que contiene la diferencia entre dos vectores, intente esto:

(map 'vector #'- p2 p1)

En su ejemplo, devuelve:

#(2 2)

Creo que el problema es que se han citado en la lista, es decir.

'(p1 p2)

En su lugar debe tener

(list p1 p2)

debido a que en su programa en realidad se trata de aplicar mapcar a una lista que contiene dos elementos, el símbolo de p1 y p2 el símbolo.

antti.huima tiene razón. Sin embargo, hay otro error en su código:

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

Tenga en cuenta el signo de número antes de la comilla simple que precede a la lambda.

Si lo desea, puede utilizar SÍMBOLO-VALOR:

(defvar p1 #(1 2))
(defvar p2 #(3 4))
(mapcar #'(lambda (x) (aref (symbol-value x) 0)) '(p1 p2))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top