Saya ingin mendapatkan efek dari variabel statis dengan menggunakan defun
bagian dalam let
dengan pengikatan leksikal untuk membuat penutupan. Namun, saat byte-compile file, saya mendapat peringatan. Apakah saya melakukan sesuatu yang salah, atau jika tidak, adakah cara untuk menekan peringatan ini?
Saya telah membuat MCVE:
;; -*- lexical-binding: t -*-
(let ((count 0))
(defun increase-count ()
(interactive)
(setq count (1+ count))
(message "Count is: %d" count))
;; The warning happens here.
(increase-count))
Kode berfungsi seperti yang diharapkan: fungsi increase-count
mencetak "Hitung adalah: n" di mana n bertambah setiap kali dipanggil. Namun, ketika byte-compiling file ini, saya mendapatkan peringatan berikut:
In end of data:
mcve.el:11:1:Warning: the function ‘increase-count’ is not known to be
defined.
Sepertinya saya yang increase-count
harus selalu didefinisikan sebelum dipanggil pada akhir blok let. Bukankah ini masalahnya?
byte-compilation
lexical-scoping
defun
lexical-binding
Will Kunkel
sumber
sumber
defun
tidak melakukan apa yang Anda pikirkan, ia selalu menciptakan definisi tingkat atas. Elisp memang bukan Skema ...Jawaban:
Cara byte-compiler untuk memutuskan apakah suatu fungsi akan didefinisikan atau tidak sangat "naif" dan tertipu bahkan dalam kasus "jelas" Anda. Tetapi Anda dapat menulisnya dengan cara yang memungkinkan kompiler memahami apa yang terjadi:
Tentu saja, yang lebih baik adalah meningkatkan logika byte-compiler: patch diterima untuk itu.
sumber
Untuk menekan peringatan byte-compiler, coba tambahkan ini sebelum kode Anda, mulai dari kolom 0 (paling kiri):
C-h f declare-function
memberitahumu:sumber
FILEONLY
argumen nihil diperlukan untuk kasus ini? BTW, saya akan memberikan jawaban yang sama ;-).FILEONLY
sepertinya tidak diperlukan di sini, untukku. Yang tampaknya menunjukkan yangcheck-declare
mengakuif
dang
menantang.f
dang
hanya masuk akal dalam konteks emacs.stackexchange.com/q/39439 ?FILEONLY
sepertinya tidak diperlukan di sini, untuk saya. Yang tampaknya menunjukkan yangcheck-declare
mengakuiincrease-count
pertahanan. ;-)Saya percaya menempatkan definisi tersebut di dalam
eval-and-compile
juga akan secara dangkal mencapai hasil yang sama seperti dalam jawaban yang benar Stefan :Saya, bagaimanapun, hampir tidak terbiasa dengan kehalusan penggunaan
eval-and-compile
dan, lebih jauh, jangan berharap pendekatan ini dengan cara apa pun lebih unggul.sumber