我在Google Common Lisp Style Guide中读到(参见最后一节),Common Lisp标准中有一个关于and
作为类型说明符的错误。也就是说,它不会“短路”,或等效地评估评估顺序,与example中假设的相反:
(and integer (satisfies evenp))
但是,看一下CLtL2的section 4.4,就说明了
当
typep
处理and
类型说明符时,它始终按从左到右的顺序测试每个组件类型,并在找到交集的一个组件后立即停止处理有问题的对象不属于。
该部分进一步说明了这一点,正是为了允许satisfies
被其他类型过滤,以避免错误。
我可以安全地假设这是Google样式指南中的错误,或者自CLtL2以来行为是否已更改?
答案 0 :(得分:8)
几年前我遇到了同样的问题。
我在ANSI CL中找不到任何支持订单或过滤的内容。但是也没有讨论变更的问题。您提到的示例假设CLtL2解释。
因此,假设编译器可能会对类型进行重新排序并且已从CLtL2更改它是有意义的。