SubL中类子类关系验证及(genls)表达式真值检查问询
在SubL中检查类继承关系的方法
首先,你提到的(genls #$Automobile #$RoadVehicle)这种调用方式其实不符合genls函数的语法——genls只需要传入一个类作为参数,它会返回这个类所有直接和间接父类的列表(比如你说的(genls #$Automobile)会返回#$RoadVehicle、#$WheeledTransportationDevice等)。要判断#$RoadVehicle是否是#$Automobile的父类,你可以这样做:
最直接的方式是用
member函数检查目标父类是否在genls的返回列表里,再转换成布尔值:(not (null (member #$RoadVehicle (genls #$Automobile))))原理是
member找到匹配元素时会返回从该元素开始的子列表,找不到则返回nil,用not (null ...)就能得到标准的布尔值t或nil。如果你想要一个像
genls-p那样直接接受两个类参数的函数,因为默认没有这个内置函数(你遇到的GENLS-P is not fboundp就是证明),可以自己封装一个:(defun genls-p (subclass superclass) (not (null (member superclass (genls subclass)))))封装好之后,你就可以直接调用
(genls-p #$Automobile #$RoadVehicle),它会返回t(如果继承关系成立)或者nil(如果不成立)。
另外补充一点:如果你只需要检查直接父类关系,SubL里有内置的direct-genl-of-p函数,用法是(direct-genl-of-p #$Automobile #$RoadVehicle),但这个只会判断#$RoadVehicle是不是#$Automobile的直接父类,不会涵盖间接继承的情况。
内容的提问来源于stack exchange,提问作者Carl
相关产品推荐
相关产品推荐

