我在谷歌通用Lisp风格指南 (参见最后一节)中看到,在通用Lisp标准中,将and作为类型说明符是错误的。也就是说,它没有“短路”,或者等效地说,评估顺序没有得到保证,这与示例中假设的情况相反。
(and integer (satisfies evenp))然而,看看第4.4节 of CLtL2,有人说
当
typep处理and类型说明符时,它总是按照从左到右的顺序对每个组件类型进行测试,并在找到所讨论对象不属于的交集的一个组件时立即停止处理。
本节进一步解释说,这样做恰恰是为了允许satisfies被另一种类型过滤,以避免错误。
我是否可以有把握地假设这是谷歌风格指南中的一个错误,或者自CLtL2以来的行为是否发生了变化?
发布于 2015-04-21 11:08:22
几年前我也遇到过同样的问题。
我在ANSI CL中没有发现支持订单或过滤的任何内容。但是,也没有任何问题来讨论改变。您提到的示例假定是CLtL2解释。
因此,假设编译器可以重新排序类型,并且这与CLtL2不同,这是有意义的。
https://stackoverflow.com/questions/29768959
复制相似问题