Misalnya, katakan saya punya daftar string L
, mungkin dari &rest
argumen. Apa yang bisa saya lakukan agar L
efeknya sama dengan yang berikut ini?
(concat (first L) (second L) ... (last L))
(Saya tahu mapconcat
akan bekerja di sini untuk contoh ini , tetapi saya sedang mencari proses umum.)
Apa yang ingin Anda lakukan sepertinya melipat atau melepaskan lipatan dari urutan objek dengan tipe yang sama. Sangat menggoda untuk menggunakan
apply
untuk tujuan ini, karena dalam banyak kasus memang akan berhasil. Tapi ini bukan alat yang tepat untuk ini, dan inilah alasannya:apply
adalah mekanisme meta-pemrograman, tidak hanya itu, itu juga terlalu umum untuk tugas karena dapat menangani urutan objek dari tipe yang berbeda, tidak harus memanggil fungsi dua argumen. Akibatnya, beberapa kali Anda akan mendapatkan perilaku yang salah, misalnya:Namun secara intuitif, Anda akan mengharapkan ketidakcocokan jenis di sini.
Tidak ada cara untuk memastikan
apply
akan dapat memproses argumen sebanyak yang Anda bisa berikan, itu biasanya batas yang ditentukan oleh implementasi bahasa.Fungsi yang dipanggil oleh
apply
akan bisa mendapatkan referensi dari daftar argumen yang diteruskan dengan cara ini. Ini juga tidak jelas, dan dapat menyebabkan kesalahan di kemudian hari:Jika daftar argumen disalin, maka Anda membayar harga lebih banyak memori daripada yang dibutuhkan, tetapi jika itu tidak disalin (lulus apa adanya), maka Anda berisiko merusak daftar, jika fungsi yang dipanggil mengubahnya.
Jadi, cara yang lebih baik untuk melakukannya adalah menggunakan
cl-reduce
. Manfaatnya adalah ia dirancang khusus untuk melakukan tugas-tugas semacam ini.sumber