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

时间:2015-01-19 13:27:48

标签: rebol

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

我期待的是能够执行以下操作:

mytype!: make datatype! ... ; some spec here

这可能吗?以下内容并没有让我充满希望:

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

从链接:

  

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

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

2 个答案:

答案 0 :(得分:5)

https://github.com/giuliolunati/rebol/tree/utype

中尝试了utypes的实现

例如,我实施了complex! utype

基本上,utypes被实现为具有点分形式的特殊方法的对象:因此,。add执行+ op等。

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

答案 1 :(得分:4)

经常建议,截至今天未实施 available only as an experimental patch by Giulio

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

>> type? :append
== action!

动作是第一个参数的一种“方法调用”(即多态),随后的参数将传递给它。目前,用户无法创建动作或创建响应它们的新数据类型。

对于Rebol 3,在名字“utype”下提出了用户定义的数据类型 - 请查看"What's known about UTYPE! in Rebol?"以获取更多信息。

然而,在objects announcement for 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
]
     

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