cnd*_*cnd 2 f# programming-languages metaprogramming nemerle
我想简化表达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"); <[ ]>
Run Code Online (Sandbox Code Playgroud)
然后用法:
if (x == 1 ||| 2) { .. }
Run Code Online (Sandbox Code Playgroud)
我可以在F#中以这种方式创建运算符吗?
我同意Brian的意见,即为了保存三个字符而构建一个宏可能不是一个好主意.这只会使程序更难阅读(对于那些不了解您的自定义宏或改变运算符含义的人).
此外,您很可能使用标准F#构造(如模式匹配)以更简洁的方式编写相同的逻辑.例如:
match x with
| 1 | 2 -> printfn "yes"
| _ -> printfn "no"
Run Code Online (Sandbox Code Playgroud)
惯用解决方案将取决于具体情况,这很难从您给出的示例中判断出来.