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?
elisp
coding-conventions
gavenkoa
sumber
sumber
w3m-DEPENDENT-CODE
dari yang hilangw3m-util
.(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 menggunakaneval-after-load
, memintarequire
hanya perlu membuat sukses byte-kompilasi dengan ekspansi makro.Jawaban:
Apakah Anda bertanya kepada Emacs apa
eval-when-compile
yang harus dilakukan?C-h f eval-when-compile
memberi tahu Anda bahwa ia mengevaluasi arg juga pada waktu buka:Dikatakan bahwa jika ditafsirkan itu seperti
progn
. Dan itu secara eksplisit mengulang ini.Fungsi atau nama makro jarang mencerminkan perilaku dengan sempurna. Tetapi dalam hal ini sepertinya Anda mencari perilaku yang berbeda, yang mungkin disebut
eval-only-when-compile
.sumber
eval-only-when-compile
nama bantu saya mengerti point to nameeval-when-compile
, terima kasih!Untuk mengevaluasi kode hanya pada tahap kompilasi, gunakan
eval-when
macro yang diberi tanggal oleh RMS pada 1993-07-30.cl-eval-when
muncul di 2012-06-03 dari Stefan Monnier dan tidak tersedia untuk Emacs 22.x (jika Anda peduli, saya tahu).Misalnya, Anda ingin menyingkirkan
Warning: assignment to free variable
:tambahkan saja di atas baris itu:
Perhatikan bahwa ini hanya berguna untuk kompilasi byte
.emacs
file. Jika Anda mengembangkan perpustakaan, Anda harus melakukanrequire
atau membagi file perpustakaan menjadi terpisah dan memuat hanya fitur yang diperlukan.sumber
(defvar auto-revert-interval)
defvar
solusi dalam banyak kasus tetapi juga mencari solusi yang lebih kuat . Saya bisa salah ketik nama atau paket dapat menghapus definisi dan pemeriksa kompilasi akan diam dalam kasus seperti itu.