インデックスがリストにある配列にアクセスしたい。この utility と呼びましょうarefl
。次のように定義されています。
(arefl array '(x y z ...)) equals (aref array x y z ...)
私の目標は、任意のサイズの行列で動作するいくつかの汎用関数を作成することです。
私はマクロでそのようなことを実装することに失敗しましたaref
. 私が持っている最も近いものは次のとおりです。
(defmacro arefl (array is)
"Access array by a list of indices"
`(apply #'aref (cons ,array ,is)))
これは動作し、実際には動作し(setf (arefl array is) value)
ますが、コンパイラは、少なくともsbcl
を再定義していることを知らせる警告をスローしますsetf
(私は推測します) apply
。警告は次のとおりです。
; in: DEFUN (SETF AREFL**)
; (SETF (APPLY #'AREF ARRAY (REDUCE 'CONS ARGS :FROM-END T)) NEW-VALUE)
; --> LET* MULTIPLE-VALUE-BIND LET APPLY MULTIPLE-VALUE-CALL
; ==>
; #'(SETF AREF)
;
; caught STYLE-WARNING:
; defining as a SETF function a name that already has a SETF macro:
; (SETF AREF)
;
; compilation unit finished
; caught 1 STYLE-WARNING condition
--
より良い方法はありますか?私はうまくsetf
機能し、別の関数への呼び出しを必要としない実装を探してapply
います。cons