You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:25:12