Ist es möglich, Variablen mehrere Rückgabewerte direkt zuzuweisen, ohne eine temporäre Variable in Emacs Lisp zu durchlaufen?
Angenommen, ich habe eine Funktion, die eine Liste mit zwei Listen zurückgibt:
(defun test-func ()
(setq a '(a b))
(setq b '(c d))
`(,a ,b))
Wenn ich den ersten Rückgabewert list-a
und den zweiten Rückgabewert zuweisen möchte list-b
, kann ich dazu eine temporäre Variable verwenden temp
, zum Beispiel:
(let* ((temp (test-func)) (list-a (car temp)) (list-b (cadr temp)))
(message-box (prin1-to-string list-a))
(message-box (prin1-to-string list-b)))
Kann man das einfacher machen? (Ich bin Perl und Python gewohnt, bei denen Sie keine temporäre Variable angeben müssen.)
let-binding
Håkon Hægland
quelle
quelle
cl-destructuring-bind
Makro versuchen . Wollten Sie auch wirklichsetq
in einem verwendendefun
?setq
erstellt eine "spezielle" (global zugreifbare) Variable, die Sie normalerweise außerhalb einer Funktion platzieren würden (da es wenig Sinn macht, dieselbe Variable mehr als einmal zu deklarieren, während Funktionen mehr als einmal ausgeführt werden sollen).let
innerhalb der Funktion zu verwenden .. Ich hatte nicht vor, globale Variablen zu setzen :)Antworten:
Common Lisp hat eine spezielle Funktion - mehrere Werte , und die Emacs Lisp-Kompatibilitätsbibliothek emuliert sie mithilfe von Listen .
So können Sie tun
(Laden
cl-lib
und verwenden Sie dascl-
Präfix für alle CL-Funktionen in EL).NB : Wenn Sie sich die oben verlinkte SO-Antwort ansehen, werden Sie sehen, dass das Emulieren von MV mit Listen, gelinde gesagt, suboptimal ist (siehe auch @ Stefans Kommentar unten).
quelle
multiple-value-bind
anstelle voncl-multiple-value-bind
(nur letzteres scheint im Handbuch gnu.org/software/emacs/manual/html_node/cl/Multiple-Values.html dokumentiert zu sein )?cl
Packung ist nicht mehr zum Gebrauch bestimmt. Sie solltencl-lib
stattdessen immer das Paket verwenden, das Funktionen mit demcl-
Präfix definiert.cl-values
: Es ist eine "Best Effort" -Emulation von CommonLisp,values
aber nicht wirklich kompatibel, da es nur eine Liste zurückgibt (dh es ist eine Art Lüge), und meiner Erfahrung nach landen die Leute früher oder später Manipulieren dieser als Listen (dh Brechen der Abstraktion): Verwenden Sie Listen besser explizit (und wenn Sie nicht mögenpcase-let
, verwenden Siecl-destructuring-bind
lieber alscl-multiple-value-bind
).cl-lib
Abgesehen davon, dass Sie sich auf das Kompatibilitätspaket verlassen, ist die in Elisp empfohlene Methode, Folgendes zu verwendenpcase
:Neben
pcase-let
gibt es auchpcase-dolist
,pcase-lambda
undpcase
selbst.quelle