どのようにLispでは、配列ではなく、自分のシンボルのリストを作るには?

StackOverflow https://stackoverflow.com/questions/1874418

質問

私は、アレイ間の差分を取得する機能をしようとしますが、今のサブセットだけを作りたいんだ: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.

私はメイクの配列とそれを作る場合は、同じエラーます。

どのように私はラムダ関数を適用するか、または一般的なケースでは(aref x 0)、または(aref x N)を適用する方法?

最後に、私はデルタ返す関数作りたい:P2 - P1を

役に立ちましたか?

解決

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

EDIT:ベクトルを減算するために、あなたは MAPになります機能。あなたが複数の配列を提供できることに注意します。

他のヒント

2つのベクトル間の差異を含むデルタベクトルを取得するには、これを試してください:

(map 'vector #'- p2 p1)

あなたの例では、それは返します:

#(2 2)

私はこの問題は、あなたがリスト、すなわちを引用していることだと思います。

'(p1 p2)

あなたが代わりに持っている必要があります。

(list p1 p2)

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

antti.huimaは右のそれを持っています。しかし、あなたのコード内の別のエラーがあります:

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

lambdaの前に単一引用符の前にハッシュマークに注意します。

あなたがしたい場合は、

、あなたはSYMBOL-VALUEを使用することができます:

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