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

myd*_*rms 8 rebol

看到你可以将函数的参数限制为特定的数据类型,你可能想要定义自己的数据类型,但我在Rebol文档中看不到任何暗示这是语言特征的东西(除非我没有'看起来很好).

我期待的是能够做如下的事情:

mytype!: make datatype! ... ; some spec here
Run Code Online (Sandbox Code Playgroud)

这可能吗?以下内容并没有给我带来太多希望:

http://www.rebol.it/giesse/custom-types.r

从链接:

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

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

giu*_*ati 5

https://github.com/giuliolunati/rebol/tree/utype中尝试了utypes的实现

举个例子,我实现了复杂!UTYPE

基本上,utypes被实现为具有点状形式的特殊方法的对象:所以,.add执行+ op等.

现在你可以重载所有动作(但是make),以及一些原生(数学函数,比较,形式,模具,打印,探测)


Hos*_*ork 4

通常建议,截至今天尚未实现 ,仅作为 Giulio 的实验性补丁提供

任何有用的自定义数据类型提案通常都伴随着将它们挂钩的愿望,以便它们可以有效地“重载”诸如+追加之类的东西。有一个称为ACTION 的内部抽象层!理论上提供了放置这些钩子的地方:

>> type? :append
== action!
Run Code Online (Sandbox Code Playgroud)

操作是对第一个参数的一种“方法调用”(即多态),随后的参数将传递到该方法。目前还没有公开的方法供用户创建操作或创建响应它们的新数据类型。

对于 Rebol 3,用户定义的数据类型被提议为“utype”——请查看“Rebol 中关于 UTYPE 的已知信息?” 了解更多。

然而,在Red 的对象声明中,我注意到最后有一些小字:

为了帮助 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
]
Run Code Online (Sandbox Code Playgroud)

此添加不仅允许对参数进行更细粒度的类型检查,而且还可以帮助用户更好地记录其代码。