どのようにLispでは、配列ではなく、自分のシンボルのリストを作るには?
-
18-09-2019 - |
質問
私は、アレイ間の差分を取得する機能をしようとしますが、今のサブセットだけを作りたいんだ: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))