问题标签 [multi-stage-programming]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
f# - F# 引号:变量可能会超出范围
我有这段代码:
从http://www.cs.rice.edu/~taha/publications/journal/dspg04a.pdf中的 MetaOcaml 示例转换而来
在论文中解释了上面的例子将产生以下参数3
和.<1>.
(在 MetaOcaml 表示法中):
正如您所看到的,x
's 被替换为等x_1
,x_2
因为x
否则只会指代x
最里面的fun
。
但在 F# 中这是不允许的。我收到编译时错误:“变量 'x' 绑定在引号中,但用作拼接表达式的一部分。这是不允许的,因为它可能会超出其范围。” 所以问题是:如何改变它以便编译并具有与 MetaOcaml 输出相同的语义?
更新评论:我使用 PowerPack 来实际评估报价。但我认为这与它没有任何关系,因为错误发生在编译时。到目前为止 QuotationEvaluation 有效。但是,我知道这可能不是最有效的实现。
更新 Tomas 的回答:
我真的不希望x
成为全球性的,或逃避范围。但我想要的是相当于
带引号。您的回答给出(h 3 <@ 1 @>).Eval() = 4
了上述产生的位置h 3 1 = 7
。在这里,我想7
成为答案。
f# - F# 引用的另一个限制?
今天早些时候我遇到了 F# 引用的限制,在这里问了一个问题:F# 引用:变量可能会超出范围
现在,在将http://www.cs.rice.edu/~taha/publications/journal/dspg04a.pdf中出现的示例从 MetaOcaml 转换为 F#时,我可能遇到了另一个限制。
这次我有这个 MetaOcaml 片段:
我把它转换成
我收到以下编译时错误:This expression was expected to have type int -> Expr<int> but here has type Expr<'a>
使用两个<@ f @>
.
直觉上,我认为这个错误很有意义。但是在这种情况下,F# 中有没有办法描述我想要的东西?
代码示例: