Como fazer uma lista de arrays, e não os seus símbolos, em Lisp?
-
18-09-2019 - |
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
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))