Syntax 模块短符号

Syntax 模块短符号,syntax,module,ocaml,Syntax,Module,Ocaml,在Lua中,有一个简短的符号用于将“self”发送到函数,因此可以编写a.draw(a,100.0)。难道不能对OCaml进行类似的扩展,让List.length l写入l::length和List.map(fune->e+1)l像l::map(fune->e+1)那样写入List是一个OCaml模块,而不是一个OCaml对象吗。编写List.length时,调用属于模块列表的函数length(第一个直觉是将模块作为名称空间或库) 从 模块的主要动机是将相关定义(如数据类型的定义和该类型上的相关

在Lua中,有一个简短的符号用于将“self”发送到函数,因此可以编写
a.draw(a,100.0)
。难道不能对OCaml进行类似的扩展,让
List.length l
写入
l::length
List.map(fune->e+1)l
l::map(fune->e+1)
那样写入
List
是一个OCaml模块,而不是一个OCaml对象吗。编写
List.length
时,调用属于模块列表的函数
length
(第一个直觉是将模块作为名称空间或库)

模块的主要动机是将相关定义(如数据类型的定义和该类型上的相关操作)打包在一起,并为这些定义强制实施一致的命名方案。这样可以避免名称用尽或意外混淆名称

此外,对于一个对象,您需要在使用它之前创建一个(使用new)(对其调用函数f,例如,
myobject\f

例如,从文档中

现在我们创建一个新的点p,点类的实例


这是几个月前Fabrice Le Fessant在ocaml bugtracker上提出的问题:,灵感来源于他在图书馆的工作(见设计说明)

该功能请求引发了一场讨论(请参见PR#6012链接了解讨论内容),但我认为大家一致认为这不是一个好主意。人们不喜欢添加特定的语言特性来支持模块编程类似于对象编程


我认为你可以把这个想法分解成更小的部分,每一部分都很有趣,但是需要更多的工作才能被充分理解,从而被集成到一个成熟的编程语言中。例如,您在暗示某种形式的代码推断。

不是很优雅,因为OCaml值及其类型都不属于模块。即使我们知道表达式的完整类型,我们也不知道默认情况下应该从哪个模块获取函数

在示例
l->length
代表
List.length l
,编译器需要知道我们的想法是
l
属于模块
List
(它甚至不为内置类型
'a List
提供类型别名)。或者我们指的是
电池.列表.长度

因此,需要声明“l使用模块列表”。

如果您查看此内容,您会发现我编写的camlp4语法扩展在wxOCaml上下文中实现了这一点(它位于wxOCaml的分支“wx语法”中)

当前语法是

 module x -> M in E
你可以使用的地方

 x->f
而不是

 M.f x
在表达式E中,我认为后一种语法实际上很好,但我建议通过以下方式更改第一种语法:

 let module x -> M in E

为了讨好压头。语法文件“pa_wx.ml”简短且易于修改,您可以在第563行的“drawing.ml”中看到生成的代码-例如。

我认为您混淆了方法和函数。看一些关于区别是什么的问题:。你说的“添加”是什么意思?@PascalCuoq,我想是“添加”的拼写错误。我很乐意使用camlp4的纯语法版本,但我想没有这样的扩展。我不知道你的意思,正如您所演示的示例所示,仅使用camlp4是无法完成的。您如何从标识符
l
猜出
l:map
实际上是
List.map
?您可以使用约定吗
l
具有类型
列表
,因此在
列表
模块中查找函数
映射
(大写字母)?你在camlp4中有反射,不是吗?当然,这将与在所有模块中使用
t
作为主类型的约定相冲突。你也可以按照加里格的建议(在你的链接中)用
let f(l->List)
引入简短的符号。好的,我让它在顶层工作,但是你会如何在编译器中使用语法(已经尝试了许多替代方法)?就像任何camlp4扩展一样,类似于'ocamlc-pp“camlp4o pp_wx.cmo”-c file.ml'在匹配情况下可能是
的错误。我在github发布了一期。
 M.f x
 let module x -> M in E