Ungkapan umum untuk mengatasi ekspansi makro atau menyelesaikan peringatan tentang variabel yang tidak ditentukan selama byte-compilation:
(eval-when-compile
(require 'cl-lib))
Tapi ini require ...
dikompilasi menjadi .elc
file! Saya menemukan yang cl-eval-when
memiliki semantik yang tepat (sesuai nama).
Biasanya kita tidak memerlukan require
file situs danpackage.el
Misalnya saya ingin byte-compile saya .emacs
yang menggunakan beberapa makro eksternal, tetapi diam-diam melewati jika tidak ada paket seperti itu:
(cl-eval-when 'compile
(condition-case err
(require 'w3m-util)
(error (byte-compile-warn "Failed by: %S" err))))
(w3m-util-DEPENDENT-CODE ...)
Cara lain untuk melakukan ini adalah:
(ignore-error
(require 'w3m-util)
(w3m-util-DEPENDENT-CODE ...))
Tapi sekarang kita bukan bentuk tingkat atas ...
Apakah saya benar mengisi eval-when-compile
nama itu melakukan sesuatu yang tidak diharapkan dari namanya?
(when (require 'w3m-util nil t) (w3m-util-DEPENDENT-CODE...))
(when (require 'w3m-util nil t) ...)
adalah ungkapan yang bagus! Tapi saya mencoba membuat .emacs
file yang sempurna , bukan perpustakaan. Jadi, ingatlah untuk menunda pemuatan kode (atas permintaan) dengan bantuan pemuatan otomatis. Untuk alasan ini, saya banyak menggunakan eval-after-load
, meminta require
hanya perlu membuat sukses byte-kompilasi dengan ekspansi makro.
w3m-DEPENDENT-CODE
dari yang hilangw3m-util
.