Pergunta

Eu estou tentando fazer uma função para obter um delta entre matrizes, mas agora só quero fazer um subconjunto:. Começar 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.

O mesmo erro se eu fizer isso com make-array.

Como faço para aplicar a função lambda, ou como aplicar (aref x 0), ou (aref x N) no caso geral?

No final, eu quero fazer uma função que retorna um delta:. P2 - p1

Foi útil?

Solução

mapcar leva uma função como primeiro argumento. '(lambda (x) (aref x 0)) é o mesmo que (quote (lambda (x) (aref x 0))), e este é não uma função. Você quer torná-lo uma função com (function (lambda (x) (aref x 0))), que pode ser escrita mais curto como #'(lambda (x) (aref x 0)), ou até mesmo (por causa de um padrão macro) (lambda (x) (aref x 0)).

'(p1 p2) é o mesmo que (quote (p1 p2)). meios citação que os argumentos são Não avaliada , então os nomes "P1" e "P2" stand para si, não para os seus valores. O erro tipo chegar é que o símbolo 'P1 não é um array, ele só tem um array como valor. A fim de obter uma lista dos valores, o uso LISTA:. (list p1 p2)

Em conclusão: (mapcar #'(lambda (x) (aref x 0)) (list p1 p2))

EDIT: Para subtrair vetores, você deve olhar para o MAP função; Note que você pode fornecer várias sequências.

Outras dicas

Para obter um vector delta contendo a diferença entre dois vetores, tente o seguinte:

(map 'vector #'- p2 p1)

No seu exemplo, ele retorna:

#(2 2)

Eu acho que o problema é que você ter citado a lista, i.

'(p1 p2)

Você deve sim ter

(list p1 p2)

porque em seu programa que você realmente tentar aplicar mapcar a uma lista que contém dois elementos, o p1 símbolo e o símbolo P2.

antti.huima tem direito. No entanto, há um outro erro no seu código:

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

Observe a marca de hash antes da única frase que precede o lambda.

Se você quiser, você pode usar SÍMBOLO VALOR:

(defvar p1 #(1 2))
(defvar p2 #(3 4))
(mapcar #'(lambda (x) (aref (symbol-value x) 0)) '(p1 p2))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top