2014-05-24 61 views
0

我想要在合金中有一个算术运算的函数,将它们定义为一个有趣的波纹管是否是一个好主意?合金中的算术运算

sig expre{ 
    add: expre -> expre, 
    sub: expre -> expre, 
    mult: expre -> expre, 
    div: expre -> expre, 
    mod: expre -> expre, 
    a: AttributeNames, 
    val: Int 
} 

fun Exp(e: expre): Int{ 
    plus[e.val, e.val] + 
    minus[e.val, e.val] + 
    mul[e.val, e.val] + 
    div[e.val, e.val] + 
    rem[e.val, e.val] + 
    Exp[e] 
} 

回答

0

不知道你在做什么,但看起来好像你可能正在寻找一个算术表达式的语法和一个评估函数。如果是这样,那么您就处于正确的轨道上,而不是将表达式类型定义为单个签名的字段,您可能希望将它们定义为子签名:

abstract sig Expr { val: Int } 
abstract sig UnaryExpr extends Expr { target: Expr } 
abstract sig BinaryExpr extends Expr { left, right: Expr } 
sig PlusExpr extends BinaryExpr { } {val = plus[[email protected], [email protected]] } 
sig Literal extends Expr { }