Так, ви можете за допомогою byte-defop-compiler
фактично вказати функцію, яка компілює вашу функцію, byte-defop-compiler
має деякі вбудовані смаки, які допоможуть вам визначити, що ваші функції повинні отримувати попередження на основі наявності декількох аргументів.
Документація
Додайте форму компілятора для функції FUNCTION. Якщо функція є символом, то змінна "байт-SYMBOL" повинна називати опкод, який буде використовуватися. Якщо функцією є список, перший елемент є функцією, а другий елемент - символом байт-коду. Другий елемент може бути нульовим, тобто немає опкоду. COMPILE-HANDLER - це функція, яка використовується для компіляції цього байтового режиму, або може бути абревіатурами 0, 1, 2, 3, 0-1 або 1-2. Якщо він дорівнює нулю, обробник - це "байт-компіляція-SYMBOL".
Використання
У вашому конкретному випадку ви можете використовувати одну із скорочень, щоб визначити, що вашій функції слід надати два аргументи.
(byte-defop-compiler my-caller 2)
Тепер ви функціонуватимуть попередження, коли компілюються що-небудь, крім двох аргументів.
Якщо ви хочете дати більш конкретні застереження і написати свої функції компілятора. Подивіться byte-compile-one-arg
та інші подібні функції в bytecomp.el для довідки.
Зауважте, що ви не просто вказуєте якусь функцію для обробки валідації, але насправді і компіляцію. Знову компілюйте функції в bytecomp.el забезпечить вам хороший довідник.
Більш безпечні маршрути
Це не те, що я бачив документально або обговорював в Інтернеті, але в цілому, я б сказав, що це маршрут необдумано пройти. Правильним маршрутом (IMO) було б записувати свої виправлення з описовими підписами або використовувати макрос, який надаватиме попередження під час розширення, перевіряючи довжину ваших аргументів та використовуючи byte-compile-warn
або error
показуючи помилки. Можливо, це також допоможе вам скористатися, eval-when-compile
щоб зробити перевірку помилок.
Вам також буде потрібно, щоб ваша функція була визначена до того, як вона буде використана, і заклик до byte-defop-compiler
цього повинен бути, перш ніж компілятор потрапить на фактичні виклики вашої функції.
Знову ж таки, схоже, насправді не задокументовано чи не радиться з того, що я бачив (могло бути помилковим), але я думаю, що модель, яку слід дотримуватися тут, полягала б у тому, щоб вказати якийсь файл заголовка для вашого пакету, який сповнений купою порожніх розрядів і дзвінки до byte-defop-compiler
. Це в основному пакет, необхідний для того, щоб ваш реальний пакет був змонтований.
Думка: Виходячи з того, що я знаю, а це не так багато, тому що я щойно дізнався про все це, я б порадив вам ніколи цього не робити. коли-небудь