问题标签 [metaocaml]
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# 中有没有办法描述我想要的东西?
代码示例:
types - Concoqtion (Coq + MetaOCaml) - 为什么放弃?
在对 OCaml 邮件列表上的人进行窃听之前,我想我可以在这里发布我的问题。我刚刚发现了这种美(链接到 Concoqtion 网站)。Concoqtion 是 MetaOCaml 的扩展,它允许索引类型(也许更多)。有了它,很容易创建类型还包括列表长度的列表:
这(m+1)
是在类型级别上完成的。很整齐。
但是,最后一个版本是 2007 年的(OCaml 3.08)。有谁知道为什么这个项目被取消了,或者今天 OCaml 是否有类似的东西?
ocaml - 是否可以为 MetaOCaml 设置 Merlin 环境?
是否可以为MetaOCaml设置 Merlin 环境?
ocaml - MetaOCaml 不合格的构造函数
会报错Unqualified constructor A cannot be used within brackets. Put into a separate file.
这个错误的根本原因是什么?
一些参考可以在这里找到
ocaml - 运行 MetaOCaml 代码
我刚刚安装了带有以下内容的 BER MetaOCaml:
而且我无法在 tuareg 顶级或简单的 ocaml 顶级中运行 MetaOCaml 代码。以下代码:
结果是
我试过#load "trx.cma"
了,但找不到文件。
答案编辑:
metaocaml 是正确的可执行文件。
添加后:
对于我的 .emacs,我现在可以使用C-c M-s
.
ocaml - MetaOCaml:无法从括号中运行代码
我正在尝试 MetaOCaml,所以我制作了这个很棒的代码:
为什么它不起作用?
另外,我已经尝试过了!.
,.!
因为我在网站上都看到过,但不知道哪一个是正确的。
emacs - 使用 tuareg-support-metaocaml 在 Emacs 中进行 MetaOCaml 分段注释语法高亮显示
TL:博士;我想在 Emacs 中突出显示 MetaOCaml 语法,但相关选项无效。我能做些什么?
我对 Emacs 很陌生,但使用 MetaOCaml 已经有一段时间了。
我通过我的发行版的包管理器(portage)安装了 opam 1.3.1-r1 和 emacs 25.2。随后,我通过 opam(按此顺序)安装了 BER MetaOCaml 4.04.0+BER 和 tuareg 2.0.10。我已编辑 .emacs 以添加以下行:(加载“/home/user/.opam/4.04.0+BER/share/emacs/site-lisp/tuareg-site-file”)和(setq tuareg- http://okmij.org/ftp/ML/MetaOCaml.html建议的 support-metaocaml t) 。但是,当我加载包含暂存注释的文件时,它们不会以任何方式突出显示(参见附图)。多阶段的字体锁定未受影响,并且看起来暂存注释应该是浅灰色的深蓝色。
我之前已经在 Windows 的 Linux 子系统(似乎是没有 Xorg 的普通 Ubuntu)上尝试过这个,在另一台具有 BER MetaOCaml 4.02.1+BER 和 4.04.0+BER 的机器上,使用 opam 的 tuareg 2.0.10,它是user-setup 包为我配置 emacs 并使用 Mx customize 设置 tuareg-support-metaocaml。这产生了与所附屏幕截图相同的看似不令人满意的结果。
我应该(或不应该)做些什么来让它工作,还是我误解了预期的行为?
先感谢您。
(请注意,我已经将此作为问题发布在 tuareg Github 存储库中:https ://github.com/ocaml/tuareg/issues/151 。抱歉,如果这不受欢迎。)
ocaml - 插入 let 绑定局部变量
我正在阅读 Oleg Kiselyov 的教程Reconciling Abstraction with High Performance: A MetaOCaml approach。一个练习(练习 23)要求使用 let-insertion 将数组索引访问绑定到局部变量。question 的函数是vmult_ca
,它生成用于将复数数组相乘的代码:
vout
存储结果的输出向量
在哪里。Vec (n, fun i -> v)
是一个抽象向量,其中n
是长度,并将fun i -> v
每个索引映射到一个值。
OVec (n, fun i v -> body)
是一个抽象的“输出向量”,其中n
是长度并且fun i v -> body
在每个索引i
和相关输出元素v
上运行i
。
of_complex_code
将一个complex code
值转换为一个code complex
值,例如.<{real=1.0, imag=0.0}>.
转换为{real=.<1.0>., imag=.<0.0>.}
. 该模块VMULT
定义(逐点)向量乘法(有关详细信息,请参见此处的代码)。
运行时,vmult_ca
生成以下代码:
注意v1_5.(i_8)
重复4次。let
挑战是在某处插入一个vmult_ca
绑定v1_5.(i_8)
到局部变量以避免重复。genlet
我可以通过简单地调用来“作弊” .<v1.(~i)>.
,但我不知道在哪里插入let
without genlet
; 任何提示将不胜感激。