Sementara saya ingat operasi swap dari contoh pemrograman bertahun-tahun yang lalu, saya tidak berpikir saya pernah membutuhkan operasi "swap" seperti itu. Jadi di mana Anda menemukan bahwa Anda membutuhkan hal seperti itu?
Stefan
@Stefan kali ini, saya sedang menulis sebuah fungsi yang membutuhkan dua argumen, dan saya ingin memastikan bahwa argumen pertama adalah yang lebih kecil dari keduanya.
PythonNut
1
@PythonNut, Anda bisa mengikat argumen pertama (min a b)dan kedua (max a b). Ini adalah salah satu solusinya. Beberapa akan berpendapat bahwa ini membutuhkan dua perbandingan ketika satu sudah cukup, itu benar. Anda dapat mengatasinya dengan satu perbandingan dengan fungsi yang lebih fungsional, misalnya menggunakan bilah penataan (cl-destructuring-bind (a . b) (if (< a b) (cons a b) (cons b a)) ...). Ini cara lain.
Mark Karpov
1
@Ark benar, tapi, setidaknya bagiku, rasanya seperti memukul lalat dengan granat tangan. cl-destructuring-bindadalah alat yang sangat kuat untuk pekerjaan ini.
PythonNut
Jawaban:
18
Jika ingatan saya baik dan Anda bersedia menggunakannya, cl-libmaka:
(cl-rotatef a b)
Perhatikan bahwa ini adalah cara umum penyelesaian masalah.
Untuk kelengkapan Anda juga harus memasukkan klasik berikut: a = a + b, b = a - b, a = a - b. Diterjemahkan ke Emacs Lisp, tentu saja :-D
Mark Karpov
1
Benar, dan untuk kelengkapan saya akan menunjukkan bahwa dalam asm atau C The XOR Trick bekerja untuk apa pun; register, memori, int, mengapung, struct, string (panjang yang sama) ... Dalam Lisp saya pikir hanya ints. Untuk blok memori yang besar, senang tidak perlu buffer temp.
jtgd
@ jtgd: Untuk blok memori yang besar, Anda dapat melakukan swap segment-by-segment, dengan buffer kecil.
(min a b)
dan kedua(max a b)
. Ini adalah salah satu solusinya. Beberapa akan berpendapat bahwa ini membutuhkan dua perbandingan ketika satu sudah cukup, itu benar. Anda dapat mengatasinya dengan satu perbandingan dengan fungsi yang lebih fungsional, misalnya menggunakan bilah penataan(cl-destructuring-bind (a . b) (if (< a b) (cons a b) (cons b a)) ...)
. Ini cara lain.cl-destructuring-bind
adalah alat yang sangat kuat untuk pekerjaan ini.Jawaban:
Jika ingatan saya baik dan Anda bersedia menggunakannya,
cl-lib
maka:Perhatikan bahwa ini adalah cara umum penyelesaian masalah.
sumber
Ini adalah ungkapan elegan yang saya gunakan ;-).
sumber
prog1
.cl-rotatef
makro berkembang.Jika bilangan bulat:
:)
sumber