OCaml:使用行号信息

时间:2016-09-11 01:05:42

标签: ocaml

我正在研究一些OCaml代码,我想定义一个复合异常类型;如下:

type exceptbase = string * string
exception UndefinedTyp of exceptbase

我希望这种例外的第一个元素是line number information。 但是,当我在下面使用一些异常处理代码时,它无法编译。

raise UndefinedTyp (__LOC__, "some exception messages")

所以这是我的问题:

  1. 如何正确定义此类复合异常类型?
  2. 请注意,由于第一个元素总是 __LOC__,我有什么方法可以节省工作量并使用__LOC__预先占用第一个元素?< / LI>

2 个答案:

答案 0 :(得分:2)

关于第二点,在vanilla OCaml中,我恐怕不可能省略__LOC__论证。

但您可以编写一个perprocessor来将Undefined "some exception message"重写为Undefined (__LOC__, "some exception message")。今天我们使用PPX框架来编写这样的预处理器。

BTW,OCaml的异常回溯包含引发异常的位置。设置环境变量OCAMLRUNPARAM=b时,OCaml运行时会在未捕获的异常终止程序时使用源代码位置打印它。编程Printexc模块提供了一些API来获取它。

答案 1 :(得分:1)

你只需要一些括号:

# type exceptbase = string * string
  exception UndefinedTyp of exceptbase;;
type exceptbase = string * string
exception UndefinedTyp of exceptbase
# raise (UndefinedTyp (__LOC__, "some exception message"));;
Exception:
UndefinedTyp
 ("File \"//toplevel//\", line 2, characters -13--6",
  "some exception message").