私はclispを使用していますが、使用できるnthcdrの設定可能なバージョンを備えたライブラリがあるかどうか疑問に思います。
2 に答える
5
あなたはそれをハックすることができます:
(let ((lst (list 1 2 3 4))
(n 2))
(setf (cdr (nthcdr (1- n) lst)) '(5 6 7))
l)
> (1 2 5 6 7)
または、独自のsetfを定義します。
;; !!warning!! only an example, lots of nasty edge cases
(defsetf nthcdr (n lst) (new-val)
`(setf (cdr (nthcdr (1- ,n) ,lst)) ,new-val))
nthcdrにsetfが定義されていない理由がわかりません。アレクサンドリアでさえ、最後にsetfを定義しているようですが、nthcdrは定義していません。
PS。nthcdrを設定したいということは、コードの悪臭として扱います。
于 2010-12-08T14:00:27.787 に答える
1
(defsetf my-nthcdr (n list) (store)
(let ((tmp (gensym)))
`(let ((,tmp (nthcdr (1- ,n) ,list)))
(rplacd ,tmp ,store)
(cdr ,tmp))))
nが0の場合は機能しませんが、LISTがシンボルの場合は機能し、マクロ展開時にNがゼロかどうかをチェックできますが、Nが数値の場合、または拡張コードにチェックを含める場合にのみ機能します。 。
于 2010-12-08T13:53:09.480 に答える