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で作っても同じエラー。

ラムダ関数を適用する方法、または適用する方法(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

2 つのベクトルの差を含むデルタ ベクトルを取得するには、次のようにします。

(map 'vector #'- p2 p1)

あなたの例では、次を返します。

#(2 2)
于 2009-12-09T15:44:52.863 に答える
1

問題は、リストを引用したことだと思います。

'(p1 p2)

代わりに

(list p1 p2)

あなたのプログラムでは、シンボル p1 とシンボル p2 の 2 つの要素を含むリストに実際に mapcar を適用しようとするからです。

于 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 に答える