确定rascal中ADT的特定类型的构造函数

时间:2014-11-06 20:19:26

标签: rascal

问题如下:

data Scalar=type1()|type2()|...

data Expr=scalar(Scalar aType)| secondForm(..) | thirdForm(..) |..

case Expr ee:binaryOperation(Expr e1,Expr e2, Op opern):
    //do something useful

如何指定确定e1和e2类型的条件,并采取以下措施,例如,

    if(e1 != scalar(_)) //do something useful
    if(e2 != scalar(_)) //do something useful

1 个答案:

答案 0 :(得分:1)

你有(至少)三种选择。

首先,您可以在案例中包括:

case Expr ee:binaryOperation(Expr e1:scalar(_), Expr e2, Op opern) :

在这种情况下,当e1不是scalar时,您需要第二个更一般的案例:

case Expr ee:binaryOperation(Expr e1, Expr e2, Op opern) :

这应该低于第一种情况。我不是订购依赖项的忠实粉丝,所以这不是我会使用的解决方案。

其次,您可以在条件中匹配此项。这与scalar

匹配
if(scalar(_) := e1)

并且当它不匹配时匹配:

if(scalar(_) !:= e1)

如果您需要内容 - scalar内的值 - 您可能希望在其中放置一个变量以在匹配中绑定它。

第三,您可以使用is运算符:

if(e1 is scalar)

if (!(e1 is scalar))

可以让您检查e1是否使用scalar构建。 is运算符确实说“e1的顶层构造函数是scalar”,如果这是您需要知道的全部内容,那么这比编写匹配项更简单。