小编pbp*_*pbp的帖子

跟踪编译器中AST节点的源位置(ocaml)

我正在使用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一个浪费空间的地方.

解决这个问题的最佳方法是什么?

compiler-construction ocaml yacc lex abstract-syntax-tree

4
推荐指数
1
解决办法
300
查看次数

使用带有ocamlbuild的外部库

我正在尝试使用ocamlbuild而不是make,但我无法正确链接我的目标文件与外部.cma库.似乎ocamlbuild首先尝试确定依赖关系然后忽略标记-L/path/to/lib.cma.随着make我只是路过所有必需的目录与-I-L标志来ocamlc,但这些似乎并没有一起工作ocamlbuild- ocamlc不断失败,因为它无法找到必要的库.

ocaml makefile ocamlbuild

4
推荐指数
1
解决办法
1759
查看次数

选择使用命令行参数的ocaml模块

在我的代码我module M = Implementation1然后我引用M,而不是Implementation1.问题是,我要重新编译我的程序以Implementation1改为Implementation2.我想通过命令行参数控制要使用的实现.那可能吗?

当所有实现共享签名时,情况是否更简单?

ocaml functional-programming module

4
推荐指数
1
解决办法
115
查看次数

在VIM中的线之间移动

假设我有一个包含N行的文件.我在第X行,我想转到第Y行,其中X和Y都在屏幕上可见.我可以通过输入来做到这一点:Y<cr>,但是如果Y> 99那就是很多打字.我也可以做abs(YX)[kj](通过abs(YX)向上或向下移动),但对于大X,Y在心理上计算这种差异并不那么容易.

有没有办法利用这个事实,X,Y在屏幕上可见并在X和Y之间快速移动?

vim text-editor edit

3
推荐指数
1
解决办法
794
查看次数

OCaml中具有类似字段的记录

这个答案中,建议的将元信息"附加"到类型的方法是使用记录:

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)

似乎多余:/.类是解决这个问题的唯一方法吗?如果可能的话,我想避免处理课程.

ocaml types class record

3
推荐指数
1
解决办法
154
查看次数

在迭代期间更改python序列大小

这里实现的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调用内部的可迭代序列以及为什么上述代码是必要的?或者它可能没有必要和冗余?

python iteration sequence

3
推荐指数
1
解决办法
169
查看次数