如何在Rebol中定义自己的数据类型?

如何在Rebol中定义自己的数据类型?,rebol,Rebol,鉴于您可以将函数的参数限制为特定的数据类型,因此您可能需要定义自己的数据类型,但在Rebol文档中,我看不到任何东西表明这是语言的一个特性(除非我看起来不太好) 我所期望的是能够做到以下几点: mytype!: make datatype! ... ; some spec here 这可能吗?以下几点并没有让我充满希望: 从链接: 目的:{ 允许程序员定义自定义REBOL数据类型 } 这是一段相当长的代码。这不是我所希望的。经常建议,到今天为止还没有实施 任何有用的自定义数据类型建议通常都需

鉴于您可以将函数的参数限制为特定的数据类型,因此您可能需要定义自己的数据类型,但在Rebol文档中,我看不到任何东西表明这是语言的一个特性(除非我看起来不太好)

我所期望的是能够做到以下几点:

mytype!: make datatype! ... ; some spec here
这可能吗?以下几点并没有让我充满希望:

从链接:

目的:{ 允许程序员定义自定义REBOL数据类型 }


这是一段相当长的代码。这不是我所希望的。

经常建议,到今天为止还没有实施

任何有用的自定义数据类型建议通常都需要将它们挂钩,这样它们就可以有效地“重载”诸如+附加等内容。有一个内部抽象层叫做动作理论上提供了放置这些挂钩的位置:

>> type? :append
== action!
动作是对第一个参数的一种“方法调用”(即多态),随后的参数被传递给第一个参数。目前,用户没有公开的方法来创建动作或创建响应动作的新数据类型

对于REBOL3,用户定义的数据类型是在名字对象“utype”下提出的——请查看更多信息

然而,在文章的结尾,我注意到了一些细微之处:

为了帮助Red编译器生成更短更快的代码,将引入一个新的#alias编译指令。此指令将允许用户将对象定义转换为可在类型规范块中使用的“虚拟”类型。例如:

#alias book!: object [
    title: author: year: none
    banner: does [form reduce [author "wrote" title "in" year]]
]

display: func [b [book!]][
    print b/banner
]
此添加不仅允许对参数进行更细粒度的类型检查,而且还可以帮助用户更好地记录其代码


在中尝试了utypes的实现

作为一个例子,我实现了

基本上,UType是通过特殊方法以虚线形式实现为对象的:so、.add实现+op等

现在,您可以重载所有操作(但make)和一些本地操作(数学函数、比较、表单、模具、打印、探测)