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为基本的模式匹配表达式.所有这些都是自动类型安全的,并且在错误使用时会产生合理的编译错误.因此,正如您所看到的,引用提供了一种非常方便且类型安全的操作代码的方法.
| 归档时间: |
|
| 查看次数: |
381 次 |
| 最近记录: |