Apakah mungkin untuk menetapkan beberapa nilai pengembalian langsung ke variabel tanpa melalui variabel sementara di Emacs Lisp?
Misalnya, katakanlah saya memiliki fungsi yang mengembalikan daftar dua daftar:
(defun test-func ()
(setq a '(a b))
(setq b '(c d))
`(,a ,b))
Jika saya ingin menetapkan nilai pengembalian pertama list-a
dan nilai pengembalian kedua list-b
, saya bisa melakukan ini dengan menggunakan variabel sementara temp
, misalnya:
(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)))
Apakah mungkin melakukan ini dengan lebih sederhana? (Saya terbiasa dengan Perl dan Python di mana Anda tidak harus menentukan variabel sementara)
let-binding
Håkon Hægland
sumber
sumber
cl-destructuring-bind
makro. Juga, apakah Anda benar-benar ingin menggunakannyasetq
di dalamdefun
?setq
menciptakan variabel "khusus" (dapat diakses secara global), sesuatu yang biasanya Anda letakkan di luar fungsi (karena ada sedikit makna dalam mendeklarasikan variabel yang sama lebih dari satu kali, sementara fungsi dimaksudkan untuk dijalankan lebih dari satu kali).let
di dalam fungsi .. Saya tidak berencana untuk mengatur variabel global :)Jawaban:
Common Lisp memiliki fasilitas khusus - beberapa nilai , dan pustaka kompatibilitas Emacs Lisp mengemulasikannya menggunakan daftar .
Dengan begitu bisa Anda lakukan
(muat
cl-lib
dan gunakancl-
awalan untuk semua fungsionalitas CL di EL).NB : jika Anda melihat jawaban SO terkait di atas, Anda akan melihat bahwa meniru MV dengan daftar adalah, secara halus, suboptimal (lihat juga @ komentar Stefan bawah).
sumber
multiple-value-bind
bukancl-multiple-value-bind
(hanya yang terakhir tampaknya didokumentasikan dalam manual gnu.org/software/emacs/manual/html_node/cl/Multiple-Values.html )?cl
paket ini tidak dimaksudkan untuk digunakan lagi. Anda harus selalu menggunakancl-lib
paket sebagai gantinya, yang mendefinisikan fungsi dengancl-
awalan ..cl-values
: ini adalah emulasi "upaya terbaik" dari CommonLispvalues
tetapi tidak benar-benar kompatibel karena semua yang dilakukannya adalah mengembalikan daftar (yaitu semacam kebohongan), dan dalam pengalaman saya orang cepat atau lambat akan berakhir memanipulasi mereka sebagai daftar (yaitu melanggar abstraksi): daftar penggunaan yang lebih baik secara eksplisit (dan jika Anda tidak sukapcase-let
, maka gunakancl-destructuring-bind
daripadacl-multiple-value-bind
).Selain mengandalkan
cl-lib
paket kompatibilitas, cara yang disarankan di Elisp adalah menggunakanpcase
:Di samping
pcase-let
, ada jugapcase-dolist
,pcase-lambda
danpcase
itu sendiri.sumber