我是水银的新手,我正试图绕过Record Syntax,但参考手册是我遇到它的唯一地方,让我感到神秘:
术语^ field1(Arg1)^ field2(Arg2,Arg3)等同于field2(Arg2,Arg3,field1(Arg1,Term))。
有人可以帮助一个真实世界的例子吗?
答案 0 :(得分:3)
记录语法是一种语法糖,手册正试图解释如何 从记录语法转换为Mercury的正常语法。这个 如果您正在尝试找出如何实现记录语法,那就没问题,但不是 如果您想学习如何使用它,将非常有用。
我建议忽略括号中的(Arg1,...) - 我不是 确定它是否实际上是语法的一部分,我从未见过有人使用它。
让我们创建一个表示笛卡尔平面上的点的结构。
:- type point
---> point(
pt_x :: int,
pt_y :: int
).
pt_x和pt_y是字段名称,它们允许我们检索a的值 点的字段。例如:
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项目,请注意github语言标记是 破碎后,许多Objective-C文件被检测为水星和许多水星 事物被检测为其他文件: