我是水星新手,我正试图围绕Record Syntax来思考,但参考手册是我遇到它的唯一地方,它让我感到困惑:
项 ^ field1(Arg1) ^ field2(Arg2, Arg3) 等价于 field2(Arg2, Arg3, field1(Arg1, Term))。
有人可以帮忙举一个真实的例子吗?
我是水星新手,我正试图围绕Record Syntax来思考,但参考手册是我遇到它的唯一地方,它让我感到困惑:
项 ^ field1(Arg1) ^ field2(Arg2, Arg3) 等价于 field2(Arg2, Arg3, field1(Arg1, Term))。
有人可以帮忙举一个真实的例子吗?
记录语法是一种语法糖,手册试图解释从记录语法到 Mercury 正常语法的转换是如何工作的。如果您想了解如何实现记录语法,这很好,但如果您想学习如何使用它,这不是很有帮助。
我建议忽略括号中的 (Arg1, ...) 东西——我不确定它是否真的是语法的一部分,而且我从未见过有人使用它。
让我们创建一个表示笛卡尔平面上的点的结构。
:- type point
---> point(
pt_x :: int,
pt_y :: int
).
pt_x 和 pt_y 是字段名称,它们允许我们检索点字段的值。例如:
format("The point's X coordinate is: %d\n", [i(Point ^ pt_x)], !IO),
format("The point's Y coordinate is: %d\n", [i(Point ^ pt_y)], !IO),
我们可以检索一个值并将其分配给一个新变量。
X = Point ^ pt_x,
而且我们还可以更新一个字段,而不必再次写出整个点。
NewPoint = OldPoint ^ pt_y := NewY,
事情变得有点复杂的地方是当它与状态变量表示法一起使用时,会出现一个额外的语法糖。
move_up(D, !Point) :-
NewY = !.Point ^ pt_y + D,
!Point ^ pt_y := NewY.
请注意,当我们读取一个值时,我们使用 !.Point,它是“当前值”的状态变量。当我们更新它时,我们可以这样写:
!:Point = !.Point ^ pt_y := NewY.
然而,这个额外的语法糖允许我们编写:
!Point ^ pt_y := NewY.
我希望这有帮助。Mercury 源代码中还有更多示例:
https://github.com/Mercury-Language/mercury
和其他 Mercury 项目,请注意 github 语言标记已损坏,许多 Objective-C 文件被检测为 Mercury 并且许多 Mercury 的东西被检测为其他文件: