我有一个庞大的 OCaml 代码库,并且希望从中获取一些类似 UML 的类/模块图,类似于某些Java 逆向工程工具所做的事情。
这些图不需要是正式的 UML 图,但至少能够看到每个模块签名中定义的函数/类型的名称对于帮助理解 OCaml 代码库非常有用。如果这可以与模块之间的关联相结合就更好了。
可以使用 来完成吗ocamldoc
?我知道它能够生成模块之间的 DOT 依赖图,但我无法确定它是否可以生成有关模块中定义的每种类型/函数的信息。
opam list -a
根据输出,列出 OPAM 当前可用的所有软件包,但不显示当前未安装的软件包的版本号opam list --help
:
(...) 输出格式每行显示一个包,每行包含包的名称、已安装的版本或 -- 如果未安装包,(...)
如何列出所有软件包及其版本号?
我目前正在尝试一起使用OCaml和GTK(使用lablgtk绑定).但是,文档并不是最好的,虽然我可以弄清楚如何使用大多数功能,但我仍然坚持改变笔记本页面(切换到不同的选项卡).
我找到了我需要使用的功能,但我不知道如何使用它.文档似乎暗示它是在子模块中GtkPackProps.Notebook
,但我不知道如何调用它.
此外,此功能的类型特征与我之前看到的不同.
val switch_page : ([> `notebook ], Gpointer.boxed option -> int -> unit) GtkSignal.t
Run Code Online (Sandbox Code Playgroud)
我认为它返回一个GtkSignal.t
,但我不知道如何将第一个参数传递给函数(括号中的整个部分).
有没有人有一些示例代码显示如何更改笔记本页面,或者可以给我一些如何做到这一点的提示?
我有一个大型 Git 存储库,几个月前在其中引入了一个错误,我想bisect
通过首先在存储库的过去引入提交,然后重放合并(执行rebase
新提交),如图所示在下图中。
我知道由于合并,Git 似乎没有像预期的那样工作,但我想更好地了解为什么会发生这种情况(以及是否有参数可以帮助它更好地工作)。
修改的文件patch
永远不会被任何提交再次修改master
我尝试rebase
使用和不使用--preserve-merges
,并且都在离提交不远的某个合并中失败patch
冲突中显示的差异没有意义,例如文件中有一些空格,另一个文件中有一些不相关的行......我可以尝试从中提取任何有用的信息,或者它只是垃圾,我不应该花任何时间尝试明白吗?
是否有不同的参数/合并策略可以帮助推进合并?
注意:最后,我的组合git apply; git bisect
确实有效,但我仍然对有关 Git 行为的替代解决方案或解释感兴趣。
在C中,我可以访问自动volatile变量而不必先进行初始化,还是总是导致未定义的行为?
例如,在映射到volatile变量的一些硬件设备中,初始化变量无论如何都没有意义,甚至可能被禁止.
在保护模式下在 x86 上运行的自定义操作系统中,除了执行特权指令并查看它是否崩溃之外,有没有办法获得当前的特权级别?
例如,寄存器CR0
包含PE
位,指示我们是在实模式还是保护模式下运行,并且可以使用汇编代码轻松检索。
特权级别有什么等价的吗?
在英特尔架构软件开发者手册提到,EFLAGS
寄存器包含两个IOPL
相关的I / O特权级别位。这与当前权限级别 (CPL) 相同吗?
GCC的在线文档声称它支持枚举器属性:
GCC允许在枚举器上设置属性.
然后它给出了使用这些属性的代码示例:
enum E {
oldval __attribute__((deprecated)),
newval
};
int
fn (void)
{
return oldval;
}
Run Code Online (Sandbox Code Playgroud)
但是当我在我的GCC(4.8.4)上尝试它时,我收到一个错误:
t.c:2:15: error: expected ‘,’ or ‘}’ before ‘__attribute__’
oldval __attribute__((deprecated)),
^
Run Code Online (Sandbox Code Playgroud)
我需要在某个地方启用它们吗?或者使用不同的GCC?
请注意,Clang也声称支持这个C扩展,但是使用Clang它可以正常工作.
我正在使用yojson
OCaml 解析 JSON 文件,在验证输入文件时,我想向用户发出包含源代码信息的错误消息。
例如,如果我发现第 5492 行的给定值不在允许的范围内,我想告诉用户:“source.json:5492 行中的值无效”。
我怎样才能得到这些信息?
(如果 yojson 无法提供此类信息,则另一个具有此信息的 OCaml JSON 库可能会很有用。)
是否需要在可能的情况下对三元运算符进行静态评估,还是编译器可以将其推迟到以后使用,从而拒绝依赖于其静态评估的程序?
更准确地说,这是程序的歧义片段:
char b[sizeof(a) > 10 ? 10 : sizeof(a)] = {0};
Run Code Online (Sandbox Code Playgroud)
取决于a
片段是否为可变长度,片段是否无效。如果a
是VLA,则sizeof(a)
不是静态确定的,因此无法进行初始化:
int main(int argc, char **argv) {
int a[argc];
char b[sizeof(a) > 10 ? 10 : sizeof(a)] = {0}; // invalid
return 0;
}
Run Code Online (Sandbox Code Playgroud)
error: variable-sized object may not be initialized
Run Code Online (Sandbox Code Playgroud)
但是,如果a
不是VLA,则可以静态评估所有内容:
int main() {
int a[42];
char b[sizeof(a) > 10 ? 10 : sizeof(a)] = {0}; // valid
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:符合标准的编译器所需的静态尽可能评估,因此必须接受第二个方案,或者允许他们“它推迟到动态评价”,并可能拒绝呢?