使用Rascal表达多态行为,并使用Rascal表达类似Java的递归

时间:2014-11-16 21:55:53

标签: rascal

假设我的数据类型定义如下:

data Constraint=type1(Lab al,Lab a2)| type2(Lab a1,TypeRoot tt)|....

其中一般模式是每个构造函数的第一个参数类型为' Lab'。那么,有一种表达模式匹配的有效/清晰的方式来执行以下操作吗?

for (Constraint cc <- constraints)
    if( type1(Lab label,_):= cc || type2(Lab label,_):=cc || .... )
        //do something useful with label. Infact, this snippet of code appears within
        //a function body, and I need to perform the match for a specific label; as follows:
        if(label==labelOfInterest) return cc;

虽然我在这,并且反对StackOverflow提出的问一个问题/线程的建议,Rascal是否支持简单的类似Java的递归?

1 个答案:

答案 0 :(得分:1)

您可以通过has运算符检查字段是否存在。有关详细信息,请参阅Rascal Tutor

您的代码将变为类似:

for (Constraint cc <- constraints)
    if( cc has a1 || .... )
        if(cc.label==labelOfInterest) return cc;

甚至更好:

for (Constraint cc <- constraints)
    if( (cc has a1 && cc.label == labelOfInterest) || .... )
        return cc;