我所说的扩展计算表达式是指通过CustomOperation属性定义自定义关键字的计算表达式。
在阅读有关扩展计算表达式的内容时,我发现@kvb编写了非常酷的IL DSL:
let il = ILBuilder()
// will return 42 when called
// val fortyTwoFn : (unit -> int)
let fortyTwoFn =
il {
ldc_i4 6
ldc_i4_0
ldc_i4 7
add
mul
ret
}
没有使用for..in..do
结构,我想知道操作如何组合。 我的直觉是从x.Zero
成员开始,但我没有找到任何参考来验证。
如果上面的示例过于技术性,这里有一个类似的DSL,在其中列出幻灯片的组件,而不使用for..in..do
:
page {
title "Happy New Year F# community"
item "May F# continue to shine as it did in 2012"
code @"…"
button (…)
} |> SlideShow.show
我有几个相关的问题:
- 如何定义或使用扩展计算表达式而不使用
For
成员(即提供一个小的完整示例)? 如果它们不再是单子,我不会太担心,因为我对它们在开发DSL方面很感兴趣。 - 我们可以使用带有
let!
和return!
的扩展计算表达式吗?如果可以,有没有不这样做的原因? 我之所以问这些问题,是因为我没有遇到过使用let!
和return!
的示例。
Quote
成员的技巧也会很有帮助。谢谢。 - padQuote
和Run
成员。这样,每当你评估你的计算表达式(例如myBuilder { myOp1; myOp2 }
),结果将是一个包含调用集的Expr<_>
,如果你没有添加Quote
方法,编译器就会进行这些调用。希望这能有所帮助。 - kvb