2010-12-08 5 views

答えて

5

あなたはとその周りにハックすることができます:nthcdrは、定義のsetfを持っていない理由を私は知らない

;; !!warning!! only an example, lots of nasty edge cases 
(defsetf nthcdr (n lst) (new-val) 
    `(setf (cdr (nthcdr (1- ,n) ,lst)) ,new-val)) 

(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を定義します。 Alexandriaでもsetfは最後には定義されていますが、nthcdrでは定義されていないようです。

PS。私はあなたのコードで悪い匂いとしてnthcdrをsetfしたいと思う扱うだろう。

+1

なぜそれは悪臭ですか?特に、setfable nthcdrが定義されていない理由がないことを暗示しているとき。 – Paralife

+0

私はそれが欲しいの理由は、私はidp要素の各ノードを注入したいと同時に、各ノードをハッシュテーブルに保存しながら、sexpツリーを横断したいということです。したがって、装飾が行われていない場合、ハッシュテーブルの値は装飾されたサブノードを参照しません。 – Paralife

+1

一般的に、Common Lispでは、リテラルデータを変更すると何が起こるかは定義されていません。 –

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が数値であるならば、それだけで動作するかどうかのチェック、または展開されたコードのチェックを含む。

関連する問題