繁体   English   中英

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

[英]Syntactic category (awareness) of define-as-computed macro?

我想创建两个使用相同匹配表达式但通过其语法类别(即动作或表达式)区分的宏。 例如我想表达

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
};

这有可能吗? 我知道我可以在无效的上下文中使用“计算”​​来调用返回值的方法,但这并不是很好。

您不需要询问在哪个上下文中匹配了宏,因为解释器将为您处理该宏。 这是一个带有在表达式上下文中返回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";
};

解释器将根据在其中看到some_function的上下文来知道要扩展哪一个:

extend sys {
  run() is also {
    some_function;

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

您可以轻松地修改这些宏以采用对象来调用方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM