我希望在我的OCaml输入文件的开头有几行代码,以便记住最后一次输入的表达式,名称为it.即,我想拥有:
# 3 + 4;;
val it : int = 7
# it;;
val it : int = 7
# let foo = 42;;
val foo : int = 42
# it + 130;;
val it : int = 137
#
Run Code Online (Sandbox Code Playgroud)
但我不希望建立一个自定义的顶层或使用camlp5或任何幻想这样的.
我目前做的是(在OCaml版本4.02.3中,我不知道为什么我有那个版本;但我希望确切的版本没关系?)如下:
#directory "+compiler-libs";;
#load "/opt/src/ocaml-4.02.3/utils/warnings.cmo";;
#load "/opt/src/ocaml-4.02.3/parsing/location.cmo";;
let convert_phrase x =
match x with
| Parsetree.Ptop_def
[{Parsetree.pstr_desc = Parsetree.Pstr_eval (e, a)}] ->
Parsetree.Ptop_def
([{Parsetree.pstr_desc =
Parsetree.Pstr_value (Asttypes.Nonrecursive,
[{Parsetree.pvb_pat =
{Parsetree.ppat_desc =
Parsetree.Ppat_var (Location.mknoloc "it");
Parsetree.ppat_loc = Location.none;
Parsetree.ppat_attributes = []};
Parsetree.pvb_expr = e;
Parsetree.pvb_attributes = a;
Parsetree.pvb_loc = Location.none}]);
Parsetree.pstr_loc = Location.none}])
| x -> x;;
Toploop.parse_toplevel_phrase :=
let parse_toplevel_phrase = !Toploop.parse_toplevel_phrase in
fun x -> convert_phrase (parse_toplevel_phrase x);;
Run Code Online (Sandbox Code Playgroud)
那种作品.
我的问题:如果我只是做了这#directory "+compiler-libs";;件事,我可以访问Toploop和Parsetree模块,但我无法访问Location模块!这是什么原因?我发现必须.cmo从我的源目录加载文件非常缺乏吸引力.
那么有没有办法做我想要的而不必有源树可用?
或者,换句话说:为什么Toploop和Location?之间存在差异?
简而言之,您应该加载的不是单个.cmo文件,而是
#load "ocamlcommon.cma";;
Run Code Online (Sandbox Code Playgroud)
在+compiler-libs目录中.
之间存在差异Parsetree,Toploop并且Location微妙......
在OCaml中,只有将其目录添加到加载路径(by #directory "<dir>")时,才能访问数据类型及其构造函数.不需要加载(by #load)对象代码.
Parsetree被称为"mli only module":它只有数据类型定义,没有定义任何值.因此,Parsetree只有将其放入加载路径才能访问所有内容.
Location定义类型和值.可以在不加载目标文件的情况下访问其数据类型和构造函数,但值需要加载.在这种情况下,location.cmo加载对象时会加载ocamlcommon.cma该对象.
Toploop是一个棘手的问题.Toploop即使没有加载toploop.cmo,您也可以访问这些值,因为它Toploop已链接并已在OCaml顶层中可用.
| 归档时间: |
|
| 查看次数: |
146 次 |
| 最近记录: |