问题标签 [ocaml-dune]
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.
ocaml - 将 ocamlformat 与 cppo 和 dune 一起使用
为了使我们的代码适用于多个 ocamlgraph 版本,我们在我们的一个文件中使用了这个片段
在我们的dune
文件中,我们使用 cppo 对其进行预处理,如下所示:
现在我们要使用dune build @fmt
. 问题是,ocamlformat 不理解尚未预处理的文件。一种解决方法是将受影响的文件添加到其中,.ocamlformat-ignore
但该文件相当大,因此很遗憾没有对其进行自动格式化。
这个问题有简单的解决方案吗?也许有一个常见的模式如何用沙丘解决这个问题?
ocaml - OCaml 崩溃时缺少信息
我是通过 opam 安装的 OCaml 的新手。我的编译器是沙丘。每次我构建我的项目并运行它时,它都会崩溃,但我没有从代码中崩溃的位置获得任何信息。
我的一个做同样事情的朋友会获得有关它崩溃的线路的信息。
如果有人有想法,那将是不可思议的!
此致,
ocaml - .cma 文件的沙丘行为
尝试使用该实用程序创建.cma
文件(库)时遇到一些问题。dune
我有以下项目树:
wherea.ml
声明了一个非常简单的函数f
,例如。当我直接运行ocamlc -o a.cma -a a.ml
,然后启动时utop a.cma
,我可以根据需要执行以下命令:
另一方面,在使用一次dune build
(生成_build
目录及其子目录)之后,_build/default/lib/a.cma
我得到的文件占用的空间是手动生成的文件的十倍,更重要的是,它不起作用。两个命令都不成功utop _build/default/lib/a.cma
,cd _build/default/lib; utop a.cma
我无法使用该模块A
:
我知道这个dune utop
命令,但是如果我想在其他地方导出/共享我的库,dune
没有安装在哪里?我应该做些什么?我使用dune
错误的方式吗?先感谢您
PS:文件内容:
库/沙丘
ocaml - 沙丘:构建库并在另一个项目中访问它并隐藏或使不可访问的私有或实现模块
我正在使用Dune构建 OCaml 项目,并且我想构建一个独立的库以在其他项目中重用它。
库的根文件夹是,并且库是用(after )mylib
初始化的。dune init lib mylib src
cd mylib
mylib
项目的根目录树如下:
以下是文件的内容。
mylib/沙丘项目:
mylib/src/dune:
mylib/src/priv.ml:
mylib/src/mymodule.mli:
mylib/src/mymodule.ml:
在给出上下文并显示这个玩具示例的每个文件的内容之后,问题如下:
- 如何构建库
mylib
并在另一个单独的项目中使用它?
(例如,在另一个项目中,我会使用以下库:
或者
)
使用 Dune,给定可执行文件,如果它发布在Opammain
上,您将编写以下dune
文件以使用库。mylib
沙丘:
- 成功构建库并将其链接到另一个项目后,如何隐藏或不公开某些模块?例如,给定之前的玩具库
mylib
,我不想公开和使模块无法访问Priv
(这样Priv
只能在模块内部使用mylib
- 就像 Java/C# 中的受保护/内部类)。
</p>
我尝试在Real World OCaml、Cornell CS3110 教科书、Dune 文档、OCaml Learn上进行搜索,但除非深度嵌套,否则我一无所获。
非常感谢您的帮助,如果我没有清楚地解释某些事情,请询问,我会尽力解释得更好。
ocaml - 当我要求使用 ocamlopt 时,为什么沙丘使用 ocamlc?
我跑了这个,沙丘正在使用 ocamlc 字节码......我正在使用exe
这意味着本机,正如我在沙丘文档中看到的那样。为什么它应该运行 ocamlopt 却运行 ocamlc?
^ 在src
目录中
ocaml - 将新建的文件复制为沙丘的节
我在 OCaml 中编写了一个库,其所有源都位于lib
文件夹中。我还在文件夹中准备了“外观”可执行bin
文件。现在我想准备一些如何使用上述可执行文件的示例。为此,我需要事先复制一个可执行文件,或者(最好)告诉 Dune 在构建后使用一个新创建的可执行文件。
这是我的问题。沙丘的copy_files
节不允许1我从_build
文件夹中复制。有没有其他方法可以在每次构建后使用新的可执行文件,或者我是否需要在某个时候复制它们并保持最新?
以下是项目的结构(以防口头描述以任何方式误导)。
1不允许我指的是本节的以下用法:
( copy_files %{project_root}/_build/default/bin/program.exe )
ocaml - 如何拥有嵌套库?对沙丘等感到困惑
我有一个使用 OCaml 的项目dune
按照基本教程中的建议,我有一个目录结构,如:
我的目录中的文件数量lib
正在增长,我希望有另一个级别的命名空间。
我想要子目录,例如:
我希望能够像这样打开它们Lib.Utils.Whatever
我认为这一定是可能的?
我试着在dune
下面创建一个文件lib/utils
:
...但open Lib.Utils.Whatever
似乎不起作用。
我找到了该subdir
节...但是如果我将其添加到lib/dune
并定义utils
为子目录library
,那么我不会得到命名空间...我必须open Utils
而不是open Lib.Utils
ocaml - Ocaml utop 不(但确实)识别 Big_int
我有一些使用模块的代码Big_int
,例如:
但是,当我用 utop 编译它时dune utop --release
(我用它release
来避免一些警告),然后我得到这个错误:
Error: Required module `Big_int' is unavailable
我已经阅读了它并且我已经阅读(https://groups.google.com/g/felix-language/c/1CfHgpe9zps?pli=1)'Big_int不再是 OCaml 发行版的一部分。它被 Zarith 取代。好吧,我知道,而且我仍然可以使用Big_int
.
我怎么知道?关键是,如果我从utop
没有错误的任何其他文件开始,并且一旦进入我 open Big_int
,那么它不会后悔:
utop # open Big_int;;
在那里,它会自动完成 my Big_int.
,就像在Big_int.add_big_int
. 所以在Big_int
某个地方并且它被识别(VSCode 也自动完成它)。
有一点我不明白。有什么帮助吗?
ocaml - Opam 中的图形安装
我正在尝试使用 安装图形opam install graphics
,但收到以下错误消息:
我尝试了以下解决方案,但它们似乎都不起作用:
- https://github.com/ocaml/graphics/issues/16(运行中
export LIBRARY_PATH=/opt/X11/lib
) - 还添加
export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig:/opt/X11/lib/pkgconfig"
到我的 .zshrc 文件中(这在与 1 相同的线程中提到。
当我运行pkg-config --list-all | grep x11
x11 库时会弹出,但由于某种原因,在尝试安装图形时似乎找不到垃圾邮件。任何的意见都将会有帮助!
这是我当前的计算机配置:
- macOS BigSur 版本 11.2.1
- Ocaml 编译器 4.11.1
更新:
此问题已在以下线程 ( https://github.com/ocaml/graphics/pull/36#issuecomment-846827032 ) 中提出,并将在新的图形版本中更新。
ocaml - 为 LLVM 安装 OCaml 绑定
我使用 OCaml 绑定构建了 LLVM13 rc4。运行后ninja install
,我看到绑定现在安装在$HOME/.opam/4.12.0/lib/ocaml
. 但是,我运行dune build
时,系统似乎没有意识到绑定已安装。
如何将构建的绑定添加到 OCaml?