我正在使用ocamllex/yacc在ocaml中编写编译器.事情进展顺利,但我遇到了设计问题.对于我创建的每个AST节点,最好在源代码中获得有关该节点的行/字符位置的信息.这对于稍后向用户提供错误消息将是有用的.
现在,我可以为我的节点添加某种元类型:
type node = Node1 of ... * meta | Node2 of ... * meta
Run Code Online (Sandbox Code Playgroud)
但这似乎是多余的.后来,当我完成验证AST时,我将不得不写
match n with
| NodeX(..., _) -> ...
Run Code Online (Sandbox Code Playgroud)
在每match一个浪费空间的地方.
解决这个问题的最佳方法是什么?
我正在尝试使用ocamlbuild而不是make,但我无法正确链接我的目标文件与外部.cma库.似乎ocamlbuild首先尝试确定依赖关系然后忽略标记-L/path/to/lib.cma.随着make我只是路过所有必需的目录与-I和-L标志来ocamlc,但这些似乎并没有一起工作ocamlbuild- ocamlc不断失败,因为它无法找到必要的库.
在我的代码我module M = Implementation1然后我引用M,而不是Implementation1.问题是,我要重新编译我的程序以Implementation1改为Implementation2.我想通过命令行参数控制要使用的实现.那可能吗?
当所有实现共享签名时,情况是否更简单?
假设我有一个包含N行的文件.我在第X行,我想转到第Y行,其中X和Y都在屏幕上可见.我可以通过输入来做到这一点:Y<cr>,但是如果Y> 99那就是很多打字.我也可以做abs(YX)[kj](通过abs(YX)向上或向下移动),但对于大X,Y在心理上计算这种差异并不那么容易.
有没有办法利用这个事实,X,Y在屏幕上可见并在X和Y之间快速移动?
在这个答案中,建议的将元信息"附加"到类型的方法是使用记录:
type _foo = ...
and foo = {n:_foo; m:meta}
Run Code Online (Sandbox Code Playgroud)
但是,如果我有多种类型,我想用元信息包装怎么办?显然,记录类型中的所有字段名称必须具有不同的名称,并且写入:
type _foo = ...
and foo = {n:_foo; m:meta}
...
type _fooX = ...
and fooX = {nX:_fooX; mX:meta}
Run Code Online (Sandbox Code Playgroud)
似乎多余:/.类是解决这个问题的唯一方法吗?如果可能的话,我想避免处理课程.
这里实现的bytes.join方法包括在迭代期间防止大小更改的代码:
if (seqlen != PySequence_Fast_GET_SIZE(seq)) {
PyErr_SetString(PyExc_RuntimeError,
"sequence changed size during iteration");
goto error;
}
Run Code Online (Sandbox Code Playgroud)
如何修改bytes.join调用内部的可迭代序列以及为什么上述代码是必要的?或者它可能没有必要和冗余?