2016-06-17 18 views
0

次のように私はelispの中popに、リストの要素をしようとしていたにリスト、メイク記号

(pop '(1 2)) 

しかし、原因のリストがされていないC/Bは動作しません、私の誤解へシンボルとして内部化されています。上記を行うための慣用的な方法はありますか、それとも適切なアプローチではありませんか?もう少し周りが乱れて私はできることがわかりました

(pop (progn (setq tmp '(1 2)) tmp)) 

しかし、それは正しいように見えません。匿名のリストを作成し、私がしようとしていたようにそれらを修正する方法はありますか?

答えて

4

pop修正その引数の値、 placeマクロ あります。変更されます

(defparameter *var* '(1 2 3)) 
(pop *var*) 
==> 1 
*var* 
==> (2 3) 

注何こと

例えば、場所の値ではなく、代わりに含まれるオブジェクトです。

例えば、

(defparameter *var-1* '(1 2 3)) 
(defparameter *var-2* *var-1*) 
(pop *var-1*) 
==> 1 
*var-1* 
==> (2 3) 
*var-2* 
==> (1 2 3) 

IOW、リスト(1 2 3)が変更されていない、変数の値のみです。

あなたは正確に何をしようとしていますか?

1

popあなたはそう思わないと思います。リストは変更されません。これは、リストのcdrで指定された変数を単にリビルドします。 Emacsの中(macroexpand '(pop foo))を実行

は、私が取得:

(car-safe (prog1 foo (setq foo (cdr foo)))) 

は、rplacarplacdなど任意のリスト・修正機能の不在に注意してください。

+1

@ jenesaisquoi変数バインディングのみが実際のオブジェクトではなく、変異されています。 – Sylwester