F#元编程:是否可以使IF X = 1或2语法?

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#中以这种方式创建运算符吗?

Tom*_*cek 9

我同意Brian的意见,即为了保存三个字符而构建一个宏可能不是一个好主意.这只会使程序更难阅读(对于那些不了解您的自定义宏或改变运算符含义的人).

此外,您很可能使用标准F#构造(如模式匹配)以更简洁的方式编写相同的逻辑.例如:

match x with
| 1 | 2 -> printfn "yes"
| _     -> printfn "no"
Run Code Online (Sandbox Code Playgroud)

惯用解决方案将取决于具体情况,这很难从您给出的示例中判断出来.

  • @DonReba是的,我知道Nemerle宏系统比F#中的运算符重载更强大.这非常简洁(即您可以定义诸如F#计算表达式或查询之类的东西,而无需等待编译器的新版本).另一方面,它非常可怕,因为人们可能扭曲语言并编写只有他们才能理解的代码.艰难的权衡取舍! (3认同)