1

我正在尝试创建一个函数来获取数组之间的增量,但现在只想创建一个子集:获取第 N 个元素。

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

如果我用 make-array 制作同样的错误。

如何应用 lambda 函数,或者如何应用(aref x 0),或者(aref x N)在一般情况下?

最后,我想创建一个返回增量的函数:p2 - p1。

4

5 回答 5

3

MAPCAR 将函数作为第一个参数。 '(lambda (x) (aref x 0))与 相同(quote (lambda (x) (aref x 0))),这不是函数。你想让它成为一个函数(function (lambda (x) (aref x 0))),它可以写成更短的#'(lambda (x) (aref x 0)),甚至(因为标准宏)(lambda (x) (aref x 0))

'(p1 p2)是一样的(quote (p1 p2))。QUOTE 表示不评估参数,因此名称“P1”和“P2”代表它们本身,而不是它们的值。您得到的类型错误是符号'P1不是数组,它只是有一个数组作为值。要获取值列表,请使用 LIST: (list p1 p2)

综上所述:(mapcar #'(lambda (x) (aref x 0)) (list p1 p2))

编辑:对于减去向量,您应该查看MAP函数;请注意,您可以提供多个序列。

于 2009-12-09T15:15:51.780 回答
3

要获得包含两个向量之间差异的 delta 向量,请尝试以下操作:

(map 'vector #'- p2 p1)

在您的示例中,它返回:

#(2 2)
于 2009-12-09T15:44:52.863 回答
1

我认为问题在于您引用了列表,即

'(p1 p2)

你应该有

(list p1 p2)

因为在您的程序中,您实际上尝试将 mapcar 应用于包含两个元素(符号 p1 和符号 p2)的列表。

于 2009-12-09T15:01:09.783 回答
0

antti.huima 是对的。但是,您的代码中还有另一个错误:

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

请注意 . 之前的单引号之前的井号lambda

于 2009-12-09T15:09:08.693 回答
-2

如果你愿意,你可以使用 SYMBOL-VALUE:

(defvar p1 #(1 2))
(defvar p2 #(3 4))
(mapcar #'(lambda (x) (aref (symbol-value x) 0)) '(p1 p2))
于 2009-12-09T15:35:07.030 回答