【发布时间】:2012-08-27 10:12:01
【问题描述】:
我想简化表达式if(x == 1 || x == 2)。
我希望我可以写 if(x == 1 or 2) 但没有语法。
其他可能性是使用 Contains 或 Any 方法,例如:if([1,2].Contains(x)),但这涉及不必要的调用。
我可以创建一些允许我这样做的运算符吗?
我可以用 Nemerle 语言编写宏:
macro @|||(left, right)
match (left)
| <[ $x == $y ]> => <[ $x == $y || $x == $right ]>
| _ => Message.Error("Error"); <[ ]>
然后用法:
if (x == 1 ||| 2) { .. }
我可以在 F# 中以这种方式创建运算符吗?
【问题讨论】:
-
我不明白为什么人们要发明复杂的新宏/构造/函数来节省三个字符的代码(“简化”)。在我看来,代码稍微长一点和“标准”会更好,而不是稍微短一点并使用作者创建的一些一次性抽象,我必须去查找它的定义。
-
无论如何,“包含”方法更通用,因为它不需要您提前知道操作数的数量。在提供用于测试列表成员资格的运算符的语言中,以下习语很常见(Python 中的示例):
if x in [1,2]
标签: f# programming-languages metaprogramming nemerle