Да, вы можете использовать, byte-defop-compilerчтобы фактически указать функцию, которая компилирует вашу функцию, byte-defop-compilerимеет некоторые встроенные тонкости, которые помогут вам указать, что ваши функции должны выдавать предупреждения, основываясь на количестве аргументов.
Документация
Добавьте форму компилятора для FUNCTION.Если функция является символом, тогда переменная "byte-SYMBOL" должна назвать используемый код операции. Если функция представляет собой список, первый элемент является функцией, а второй элемент является символом байт-кода. Второй элемент может быть нулем, что означает отсутствие кода операции. COMPILE-HANDLER - это функция, используемая для компиляции этого байта, или это могут быть сокращения 0, 1, 2, 3, 0-1 или 1-2. Если это ноль, то обработчик "byte-compile-SYMBOL.
использование
В вашем конкретном случае вы могли бы использовать одну из аббревиатур, чтобы определить, что вашей функции нужно дать два аргумента.
(byte-defop-compiler my-caller 2)
Теперь ваша функция выдаст предупреждения при компиляции с чем угодно, кроме 2 аргументов.
Если вы хотите дать более конкретные предупреждения и написать свои собственные функции компилятора. Посмотрите byte-compile-one-argи другие подобные функции в bytecomp.el для справки.
Обратите внимание, что вы указываете не только некоторую функцию для проверки, но и на самом деле компиляцию. Снова скомпилируйте функции в bytecomp.el, и вы получите хорошую ссылку.
Безопасные маршруты
Это не то, что я видел документально или обсуждали в Интернете, но в целом я бы сказал, что это неправильный путь. Правильный маршрут (IMO) будет состоять в том, чтобы написать ваши определения функций с описательными сигнатурами или использовать макрос, который будет выдавать предупреждения во время расширения, проверять длину ваших аргументов и использовать byte-compile-warnили errorдля отображения ошибок. Вам также может пригодиться eval-when-compileпроверка ошибок.
Вам также необходимо определить свою функцию до того, как она когда-либо будет использована, и вызов byte-defop-compilerдолжен быть выполнен до того, как компилятор перейдет к фактическим вызовам вашей функции.
Опять же, кажется, на самом деле не документировано или не советовано из того, что я видел (может быть неправильно), но я предполагаю, что шаблон, который будет здесь следовать, будет указывать какой-то заголовочный файл для вашего пакета, который полон кучей пустых defuns и звонки byte-defop-compiler. В основном это будет пакет, который требуется до того, как ваш реальный пакет может быть скомпилирован.
Мнение: Исходя из того, что я знаю, что немного, потому что я только что узнал обо всем этом, я бы посоветовал вам никогда не делать ничего из этого. Когда-либо