7

私はclispを使用していますが、使用できるnthcdrの設定可能なバージョンを備えたライブラリがあるかどうか疑問に思います。

4

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