2009-12-09 59 views
1

我試圖做一個函數來獲得數組之間的增量,但現在只想做一個子集:獲得第N個元素。如何在Lisp中創建數組列表,而不是它們的符號?

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

最後我想做一個函數返回一個delta:p2 - p1。

+0

這個問題的標題是錯的。問題不在於獲取數組中的元素,而是關於創建數組列表而不是列表符號。 – 2009-12-10 11:18:11

回答

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功能;請注意,您可以提供多個序列。

+0

這回答了膚淺的問題,但沒有解決獲得三角洲的最終目標。 – Xach 2009-12-09 16:25:27

+0

xach,我在最後一段給了一個提示。 – Svante 2009-12-09 16:38:00

1

我認爲問題是,你所引述的名單,即

'(p1 p2) 

而應該有

(list p1 p2) 

因爲在你的程序中你確實嘗試應用mapcar含有兩個列表元素,符號p1和符號p2。

0

antti.huima是正確的。然而,在你的代碼另一個錯誤:

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

注意,之前的lambda單引號前的#號。

-2

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

(defvar p1 #(1 2)) 
(defvar p2 #(3 4)) 
(mapcar #'(lambda (x) (aref (symbol-value x) 0)) '(p1 p2)) 
+2

這不會對任何東西,但全球價值的工作。 – Xach 2009-12-09 16:26:10

3

獲取包含兩個向量之間的差異的增量矢量,試試這個:

(map 'vector #'- p2 p1) 

在您的例子,它回覆:

#(2 2) 
+0

這就是我暗示的。 – Svante 2009-12-09 16:43:38

+0

從我的角度來看,你更接近徽章 – 2009-12-09 19:37:22

相關問題