2016-06-17 19 views
0

ich versuchte pop ein Element einer Liste in elisp wie folgtMake-Liste in Symbol

(pop '(1 2)) 

aber aufgrund meiner Missverständnis, das nicht b funktioniert/c die Liste nicht gewesen als Symbol verinnerlicht. Gibt es einen idiomatischen Weg, um das oben genannte zu tun, oder ist das kein richtiger Ansatz? Um ein bisschen weiter findend fand ich, dass ich

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

tun konnte, aber es scheint nicht richtig. Gibt es eine Möglichkeit, anonyme Listen zu erstellen und sie an Ort und Stelle zu ändern, so wie ich es versucht habe?

Antwort

4

pop ist ein Makro die den Wert ihres Arguments ändert, eine place.

Z. B.

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

Beachten Sie, dass, was geändert wird der Wert des Ortes, nicht die in dem Ort enthaltene Objekt.

Z.B.

(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, die Liste (1 2 3) nicht geändert wird, wird nur der Wert der Variable ist.

Was genau versuchen Sie zu tun?

1

pop tut nicht, was Sie denken, dass es tut. Es ändert keine Listen. Die angegebene Variable wird einfach mit der cdr der Liste erneut verknüpft.

Lauf (macroexpand '(pop foo)) in Emacs, die ich erhalten:

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

Hinweis das Fehlen jeglicher Liste-Änderungsfunktionen wie rplaca oder rplacd.

+1

@jenesaisquoi Nur die variable Bindung ist mutiert, nicht das eigentliche Objekt. – Sylwester