0

在阅读了 QL 中对代数数据类型的支持之后,我尝试在lgtm 控制台List中定义一个类型:

newtype TList =
  TNil()
  or
  TCons(int x,TList xs)

这似乎有效。但后来我尝试定义辅助类以获得toString()谓词:

class List extends TList {
    abstract string toString();
}
class Nil extends List,TNil {
    override string toString() {
      result = "Nil"
    }
}
class Cons extends List,TCons {
    override string toString() {
        // what to put here?
        // I would like something like result = x.toString() + ':' + xs.toString()
    }
}

在这里我很难过。我不知道如何从内部x引用构造函数参数。我试过and ,但它似乎不起作用。xsConsthis.xthis.xs

如何在成员谓词中引用构造函数参数?

4

1 回答 1

1

由于Consextends TCons,您可以将其视为成员谓词中任何地方this的实例。这意味着您可以与的特定实例进行比较,并将变量绑定到构造函数参数。TConsConsthisTCons

    override string toString() {
        exists(int x, List xs |
            this = TCons(x, xs) and
            result = x.toString() + ":" + xs.toString()
        )
    }

由于您可能还希望在其他成员谓词中使用构造函数参数Cons,因此您可以改为在特征谓词中声明字段以捕获构造函数参数,然后在成员谓词中使用它们:

class Cons extends List, TCons {
    int x;
    List xs;

    Cons() {
        this = TCons(x, xs)
    }

    override string toString() {
        result = x.toString() + ":" + xs.toString()
    }
}

提醒一下:正如您链接到的 QL 手册页面所示,QL 中代数数据类型的语法仍处于试验阶段,可能会发生变化。

于 2020-01-17T17:40:40.947 回答