Да, вы можете использовать, 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
. В основном это будет пакет, который требуется до того, как ваш реальный пакет может быть скомпилирован.
Мнение: Исходя из того, что я знаю, что немного, потому что я только что узнал обо всем этом, я бы посоветовал вам никогда не делать ничего из этого. Когда-либо