Muatan otomatis dan variabel

8

Saya mengerti apa fungsi autoload untuk fungsi (mendaftarkan file untuk memuat ketika fungsi tersebut dipanggil atau string dokumentasinya diambil). Namun, tidak jelas bagaimana menggunakan fasilitas autoload dalam hubungannya dengan variabel dan makro.

Saya punya dua pertanyaan:

  1. Apa yang terjadi ketika paket memiliki parameter, diimplementasikan sebagai variabel yang dapat ditetapkan pengguna, tetapi tidak dimuat secara otomatis? Haruskah variabel seperti itu dimuat secara otomatis? Jika tidak, ternyata variabel tersebut tidak ada, lingkungan Lisp tidak tahu apa-apa tentang mereka, termasuk nilai defaultnya, sampai beberapa fungsi yang dimuat secara otomatis dari paket digunakan (biasanya setelah memuat file konfigurasi), kemudian jika pengguna mengaturnya dalam bukunya. / file konfigurasinya, itu seperti mengatur variabel yang tidak ada. Jika nilai variabel adalah daftar yang tidak kosong dan pengguna menggunakan pushatau add-to-listuntuk mengubah nilainya, apa yang sebenarnya terjadi? Apakah nilai default hilang?

  2. Apa yang terjadi ketika makro diisi otomatis? Kapan kami harus memuat ulang makro secara otomatis?

Mark Karpov
sumber

Jawaban:

5

Autoloading hanya berlaku untuk slot nilai fungsi simbol. Secara khusus, tidak ada yang namanya autoloading variabel.

Ini mungkin bentuk yang buruk untuk sebuah paket berisi variabel untuk kustomisasi pengguna yang nilai default-nya adalah daftar kosong, justru karena menjadi sulit untuk menyesuaikan variabel dalam kasus itu. Lebih buruk lagi, jika nilai default berubah, nilai yang disesuaikan mungkin juga harus berubah, namun pengguna tidak akan menyadarinya. Jika beberapa paket memiliki variabel seperti itu, mungkin lebih baik untuk mengubahnya setelah paket memuat, menggunakan eval-after-load.

Sebagian besar variabel penyesuaian akan memiliki nilai default nil, dalam hal ini Anda hanya mengaturnya menggunakan setqdalam file init Anda (atau menggunakan antarmuka kustomisasi). Dengan asumsi paket menggunakan defvaratau defcustomuntuk mengatur variabel, sebagaimana mestinya, itu tidak akan menimpa pengaturan Anda.

Makro autoloading: Tetapkan argumen kelima autoloaduntuk mencapai ini. Seperti fungsi, ini harus dilakukan jika Anda ingin menggunakan makro tanpa memuat paket terlebih dahulu - baik secara eksplisit, atau secara tersirat dengan terlebih dahulu menggunakan simbol-simbol yang dimuat secara otomatis lainnya dari paket.

Tambahan: Seperti yang ditunjukkan OP dalam komentar, komentar magis ;;;###autoloadjuga akan menyalin defvar(memang, bentuk elisp apa pun) ke file autoload. Lihat bagian Autoload di manual elisp untuk detailnya.

Harald Hanche-Olsen
sumber
Jadi, variabel yang hanya dapat setqdiedit (yaitu tidak peduli nilai apa yang mereka miliki sebelumnya) dapat memiliki standar yang ditentukan dalam defvaratau defcustombentuk, tetapi dalam kasus daftar yang dapat diperluas oleh pengguna yang terbaik untuk digunakan, eval-after-loadbukan? Juga, kadang-kadang default yang baik adalah baik, bahkan jika mereka mengambil bentuk daftar ;-)
Mark Karpov
Betul. Saya berpendapat bahwa jika diperlukan penyesuaian umum eval-after-load, itu adalah bug dalam implementasi paket. Biasanya, eval-after-loadharus digunakan untuk perbaikan bug atau penyesuaian yang sangat tidak biasa. Ngomong-ngomong, mungkin lebih baik menggunakan pengait jika paketnya tersedia.
Harald Hanche-Olsen
Masalahnya adalah bahwa saya ingin memiliki variabel yang terikat ke daftar tiga elemen (default). Defaultnya adalah yang paling diinginkan pengguna, saya yakin. Tetapi jika saya pergi eval-after-loadjalan, pengguna masih tidak akan dapat menghapus elemen dari daftar! Ini membuat saya bertanya-tanya apakah saya harus meninggalkan default sama sekali.
Mark Karpov
1
Saya tidak setuju bahwa eval-after-loadseharusnya hanya diperlukan untuk situasi yang tidak biasa. Ini adalah salah satu alat standar dalam toolkit pemuatan yang ditangguhkan. Jika orang tidak ingin menggunakan alat seperti itu, mereka dapat requireperpustakaan di depan (yang memang apa yang pendatang baru selalu disarankan untuk dilakukan - pada saat mereka mulai berpikir "Saya berharap Emacs mulai sedikit lebih cepat", mereka ' Mungkin sudah cukup belajar untuk tidak takut dengan sintaks baru :)
phils
1
@Rew: Poin Anda dalam menggunakan customize-set-variabledaripada setqmungkin bagus. Tetapi saya tidak punya waktu sekarang untuk studi yang cermat diperlukan untuk meningkatkan jawaban saya dalam hal ini. Jika Anda pikir ini penting, mengapa Anda tidak menulis jawaban Anda sendiri? Ini akan lebih terlihat daripada utas komentar panjang ini.
Harald Hanche-Olsen