[英]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.