看到你可以将函数的参数限制为特定的数据类型,你可能想要定义自己的数据类型,但我在Rebol文档中看不到任何暗示这是语言特性的东西(除非我看起来不太好。)
我期待的是能够执行以下操作:
mytype!: make datatype! ... ; some spec here
这可能吗?以下内容并没有让我充满希望:
http://www.rebol.it/giesse/custom-types.r
从链接:
目的:{ 允许程序员定义自定义REBOL数据类型 }
这是一段相当冗长的代码。不是我所希望的。
答案 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 ]
此添加不仅允许对参数进行更细粒度的类型检查,还可以帮助用户更好地记录其代码。