对于生态系统的新手来说,目前尚不清楚构建和管理中小型OCaml项目的规范首选方式.我理解ocamlc&c.的基础知识- 它们反映了传统的UNIX C编译器,看起来很简单.但是,高于单个文件的一次性编译水平,目前还不清楚如何最好地简单干净地管理编译.问题不是寻找潜在的工具,而是通过社区的经验验证一种或几种正确的(足够的)方法来构建和构建标准的OCaml项目.
我的模型用例是一个适度但非常重要的项目,纯OCaml或OCaml加上C依赖项.这样一个项目:
几个替代工具脱颖而出:
(我也看过OMake,它似乎是一个自封的" make++",它还包括一套常用语言的标准规则,包括OCaml和ocaml- makenéeOCamlMakefile,为GNU提供标准规则的模板make.)
这些都是管理OCaml构建的首选现代方式吗?
项目文件的结构如何最佳?
如何包含和管理第三方库依赖项?是首选在系统级别安装它们,还是有一种标准和直接的方式在本地管理项目?我更喜欢一种模式,其中项目尽可能保持独立.
Apple的iWork套件的早期版本使用了非常简单的文档格式:
index.apxl[z]文件,用于描述专有但相当容易理解的模式中的文档结构iWork '13完全重做了格式.文件仍然包,但什么是索引XML文件中现在在一组用型号后缀二进制文件编码.iwa打包成Index.zip.
例如,在Keynote中,有以下iwa文件:
AnnotationAuthorStorage.iwa
CalculationEngine.iwa
Document.iwa
DocumentStylesheet.iwa
MasterSlide-{n}.iwa
Metadata.iwa
Slide{m}.iwa
ThemeStylesheet.iwa
ViewState.iwa
Tables/DataList.iwa
Run Code Online (Sandbox Code Playgroud)
对于MasterSlides 1 ... n和Slides 1 ... m
从命名的角度来看,每个目的都非常明确.这些文件甚至看起来都是未压缩的,基本上所有内容文本都直接在二进制blob中作为字符串显示(尽管在可读的ASCII字符中有一些像RTF/NSAttributedString /类似相关的垃圾).
我在这里发布了Index一个简单示例Keynote文档的解压缩:https://github.com/jrk/iwork-13-format.
但是,整体文件格式对我来说并不明显.Apple长期使用简单的平台标准格式(如plist)来编码大部分文档,但文件开头没有明确的类型标记,对我来说这些iwa文件并不明显.
这些文件会响铃吗?有证据表明他们有一些合理易懂的序列化格式吗?
使用F-Script通过Keynote应用程序运行时和类转储进行翻查,我发现的唯一证据是在序列化类中使用了协议缓冲区,这些类似乎用于iWork,例如:https://github.com/ nst/iOS-Runtime-Headers/blob/master/PrivateFrameworks/iWorkImport.framework/TSPArchiverBase.h.
快速管理一些文件通过最后protoc --decode_raw的0 ... 16字节丢失产生任何明显可用的东西.
OCaml repl("toplevel")具有丰富的打印功能,适用于任何类型,用户定义或其他类型.是否可以在顶层之外访问此功能,而不必为自己的整个类型集编写一组完全自定义的值打印机?
我有一个简单的ocamlbuild项目,它使用Batteries,包括语法扩展.
_tags:
<*>: pkg_batteries,pkg_threads,pkg_batteries.syntax,syntax_camlp4o
Run Code Online (Sandbox Code Playgroud)
something.ml:
open Batteries
…
let () = …
Run Code Online (Sandbox Code Playgroud)
它是为调试而构建的:
$ ocamlbuild something.d.byte
$ ocamldebug something.d.byte
Run Code Online (Sandbox Code Playgroud)
但是,尝试使用该print命令ocamldebug会出现以下错误:
(ocd) print x
Cannot find module Batteries.
Run Code Online (Sandbox Code Playgroud)
这似乎只在一个范围内进行调试时,发生Batteries在open编.
这个错误的原因是什么?如何解决这个问题?
我有实验数据表示为每个实验的键值对的序列.一组相关实验被序列化为JSON中这些dicts的列表.这可以通过rjson包在R中解析,但数据以一种难以分析的形式加载
data <- fromJSON('[{"k1":"v1","k2":"v2"}, {"k1":"v3","k2":"v4"}]')
Run Code Online (Sandbox Code Playgroud)
产量
[[1]]
[[1]]$k1
[1] "v1"
[[1]]$k2
[1] "v2"
[[2]]
[[2]]$k1
[1] "v3"
[[2]]$k2
[1] "v4"
Run Code Online (Sandbox Code Playgroud)
试图将其转化为data.frame直接as.data.frame(data)产量:
k1 k2 k1.1 k2.1
1 v1 v2 v3 v4
Run Code Online (Sandbox Code Playgroud)
清楚地将所有实验中的键/值对序列视为平坦的一维列表.
我想要的是一个更传统的表,每个实验都有一行,每个唯一键有一列:
k1 k2
1 v1 v2
2 v3 v4
Run Code Online (Sandbox Code Playgroud)
如何在R中干净地表达这种变换?
在编译OCaml项目时,该项目链接到需要C++标准库的库(例如LLVM的OCaml绑定),使用GCC> = 4.4 的-cc g++参数ocamlc生成以下形式的极其详细的警告:
warning: deprecated conversion from string constant to ‘char*’
Run Code Online (Sandbox Code Playgroud)
如何删除这些警告?
我试图保持我的项目自包含,在项目存储库中构建和引用所有主要的第三方库依赖项.我的项目的主要ocaml部分依赖于ocamlbuild.
但是对于像Batteries Included这样的复杂软件包,人们强烈期望通过ocamlfind将它们链接到一个项目中.ocamlfind似乎假设将在全局安装软件包.(我意识到它允许环境变量及其conf指向备用位置,但它基本上似乎仍然围绕包全局配置的假设构建 - 它没有相应的-I或-L标志来动态扩展包的搜索路径,例如.有可能设置环境变量来动态覆盖ocamlfind配置来搜索项目本地树,但这比仅仅参数更难以实现,而且如果没有同时删除它也似乎很难主要系统包的可发现性site-lib,也可能是必需的.)
对于使用ocamlbuild的项目,在项目本地树中构建和构建非平凡的第三方软件包有什么理智的策略?
使用sexplib语法扩展自动生成一个类型的序列化代码,如网上很多简单例子所示:
open Sexplib
type t = { foo : int; bar : string; } with sexp
let v = { foo = 3; bar = "baz"; } in
sexp_of_t v
Run Code Online (Sandbox Code Playgroud)
无法编译,使用Error: Unbound value int_of_sexp.
Sexplib的语法扩展使得OCaml中的任意用户定义数据结构的序列化和反序列化变得容易.通常通过with sexp在类型定义的末尾添加注释来完成:
type a = A of int | B of float with sexp
Run Code Online (Sandbox Code Playgroud)
这似乎不直接推广到基于仿函数的类型,也不清楚Sexplib标准类型转换器如何捕获甚至标准仿函数.
到目前为止,我已经通过int Map.Make(String).t在序列化之前将特定的Map类型实例(例如)展平到列表来解决这个问题,反之亦然,但是肯定这一点并没有完全被Sexplib/Jane Street Core的雄心勃勃的作者所忽视.我还注意到旧版本的电池在自定义性别序列化中混合了它们的主要模块,如[Bat] Map,但这已被删除了一段时间.
如何使用Sexplib序列化常用的地图或其他复杂仿函数类型?
我的配置如下:
OCaml由Homebrew根据其默认配方安装.它存在于其中/usr/local/Cellar/objective-caml/3.12.0/[bin,lib,share],其内容被符号链接到/usr/local/[bin,lib,share].
第三方库(LLVM)安装了符号链接/usr/local/lib/ocaml/*.关键的/usr/local/lib/ocaml是,它本身不是 Homebrew Cellar的符号链接,而是一个包含OCaml Cellar路径下各个文件的链接的文件夹,因此这些第三方库文件位于/usr/local/lib/ocaml/路径中但不是原始路径
标准的OCaml编译器/解释器/构建工具始终无法找到这些第三方库,除非它们明确指出(例如ocamlbuild -cflags -I,/usr/local/lib/ocaml).
ld.conf 列表:
/usr/local/lib/ocaml/stublibs
/usr/local/lib/ocaml
/usr/local/lib/ocaml/site-lib/pcre
Run Code Online (Sandbox Code Playgroud)
这似乎表明编译器搜索路径设置正确,但我不熟悉工具链的内部工作原理.
configure和安装过程的结果(即假设问题是OCaml,如配置的那样,假设其实际的lib路径/usr/local/Cellar/objective-caml/3.12.0/lib/ocaml不是/usr/local/lib/ocaml),是否可以--prefix在配置期间强制显式添加额外的搜索路径?ocaml ×8
build ×3
ocamlbuild ×3
macos ×2
c++ ×1
camlp4 ×1
cocoa ×1
debugging ×1
format ×1
gcc ×1
gcc-warning ×1
homebrew ×1
json ×1
llvm ×1
makefile ×1
ocamlfind ×1
pretty-print ×1
r ×1
s-expression ×1