F#和Nemerle引用都用于元编程,但方法不同:Nemerle在编译时使用元编程来扩展语言,而F#在运行时使用它们.
在Nemerle中,在宏中使用引号来分离代码片段并生成新代码.大多数语言本身都是以这种方式实现的.例如,这是官方库中的一个示例 - 实现when条件构造的宏.Nemerle没有语句,所以if必须有一个else部分:when和unless宏分别if为空then和else部分提供简写.的when宏还已经扩展模式匹配功能.
macro whenmacro (cond, body)
syntax ("when", "(", cond, ")", body)
{
    match (cond)
    {
    | <[ $subCond is $pattern ]> with guard = null
    | <[ $subCond is $pattern when $guard ]> =>
        match (pattern)
        {
        | PT.PExpr.Call when guard != null =>
            // generate expression to replace 'when (expr is call when guard) body'
            <[ match ($subCond) { | $pattern when $guard => $body : void | _ => () } ]>
        | PT.PExpr.Call =>
            // generate expression to replace 'when (expr is call) body'
            <[ match ($subCond) { | $pattern => $body : void | _ => () } ]>
        | _ =>
            // generate expression to replace 'when (expr is pattern) body'
            <[ match ($cond) { | true => $body : void | _ => () } ]>
        }
    | _ =>
            // generate expression to replace 'when (cond) body'
            <[ match ($cond : bool) { | true => $body : void | _ => () } ]>
    }
}
Run Code Online (Sandbox Code Playgroud)
该代码使用引用来处理看起来像某些预定义模板的模式,并用相应的match表达式替换它们.例如,cond将给定宏的表达式与:
<[ $subCond is $pattern when $guard ]>
Run Code Online (Sandbox Code Playgroud)
检查它是否遵循x is y when z模式并给出构成它的表达式.如果匹配成功,我们可以从我们使用的部分生成一个新表达式:
<[
    match ($subCond)
    {
    | $pattern when $guard => $body : void
    | _ => ()
    }
]>
Run Code Online (Sandbox Code Playgroud)
这将转换when (x is y when z) body为基本的模式匹配表达式.所有这些都是自动类型安全的,并且在错误使用时会产生合理的编译错误.因此,正如您所看到的,引用提供了一种非常方便且类型安全的操作代码的方法.