并非所有函数都能被可靠地增强(advice)。字节编译器可能会选择将某个函数调用替换为一串指令序列,而不再调用你想要修改的那个函数。
这通常由以下三种机制之一造成:
byte-compile 属性如果一个函数的符号具有 byte-compile 属性,字节编译器会使用该属性,而不是符号本身的函数定义。See 字节编译函数。
byte-optimize 属性如果一个函数的符号具有 byte-optimize 属性,字节编译器可能会重写函数参数,或者直接选择使用另一个完全不同的函数。
compiler-macro 声明形式一个函数可以在其定义中包含特殊的 compiler-macro declare 声明形式(see declare 形式),它会定义一个 展开器(expander),在编译该函数时被调用。该展开器可能会导致最终生成的字节码不再调用原函数。