Macros 定义为计算宏的语法类别(意识)?

Macros 定义为计算宏的语法类别(意识)?,macros,specman,Macros,Specman,我想创建两个宏,它们使用相同的匹配表达式,但根据其语法类别(即动作或表达式)进行区分。 例如,我想表达 var x := obj.foo(); // value-returning ... obj.foo(); // not value-returning 使用以下宏定义: define <my_macro_void_call'action> "<obj'exp>.foo" as computed { <if in expression context>

我想创建两个宏,它们使用相同的匹配表达式,但根据其语法类别(即动作或表达式)进行区分。 例如,我想表达

var x := obj.foo(); // value-returning
...
obj.foo(); // not value-returning
使用以下宏定义:

define <my_macro_void_call'action> "<obj'exp>.foo" as computed {
   <if in expression context>
     reject_match()
   <else>
     do_something
};

define <my_macro_call'expr> "<obj'exp>.foo" as computed {
   <if in action context>
     reject_match()
   <else>
     do_something
};
define.foo”作为计算结果{
拒绝匹配()
做点什么
};
将.foo定义为计算的{
拒绝匹配()
做点什么
};

这可能吗?我知道我可以使用“compute”在一个空上下文中调用一个值返回方法,但它没有那么好。

您不需要询问宏在什么上下文中匹配,因为解释器将为您处理该问题。下面是一个函数示例,该函数要么在表达式上下文中返回
TRUE
,要么在操作上下文中输出内容:

define <my_macro_void_call'action> "some_function" as computed {
  print "matched in action context";
  result ="out(\"here I am in action context\");";
};

define <my_macro_call'exp> "some_function" as computed {
  print "matched in expression context";
  result = "TRUE";
};

您可以轻松地修改这些宏,以获取要调用方法的对象。

您尝试使用宏来模拟命令(执行某些操作以更改状态)和查询(返回某些内容)。这不符合命令/查询分离原则的精神。我很乐意使用“查询”本身,但与其他语言(如Perl)不同,您不能在无效上下文中调用值返回方法,除非您在其前面加上“计算”。术语说明:查询只返回某些内容,而不修改状态。如果不使用该返回值,调用查询就没有意义。我不同意。只有“纯”方法不会改变状态。e中没有任何限制可以阻止您更改值返回方法中的状态。我不是说该语言不支持它,只是在软件世界中不鼓励它:这也是我尝试过的。我的问题是,我试图使用“print some_function”测试表达式上下文maco,但解释器会将其放在操作上下文中。@Thorsten我会将其作为bug归档,因为根据e语言引用,print有以下BNF:p[r[int]]exp[,…]@Thorsten在INCISIV/14.20.003中尝试了它,在那里我可以做
打印一些函数
,它将向我显示
一些函数=真
对,它按照您的示例中的预期工作。但是,如果我扩展宏以匹配
。一些函数
,并执行
打印一些对象。一些函数
,它会打印“我在操作上下文中”。因此,我的问题的根本原因是匹配表达式
。一些函数
。它匹配所有变量,例如,
var x:=some_obj.some_function
,这被正确地视为一个动作,而不仅仅是我预期的右侧。为了解决这个问题,我必须为宏想出一种不同的语法。
extend sys {
  run() is also {
    some_function;

    if some_function {
      out("here I was used in expression context");
    }
  };
};