【问题标题】:How do you define your own datatype in Rebol?你如何在 Rebol 中定义你自己的数据类型?
【发布时间】:2015-03-17 12:34:06
【问题描述】:

鉴于您可以将函数的参数限制为特定的数据类型,因此您可能想要定义自己的数据类型是有道理的,但是我在 Rebol 文档中看不到任何暗示这是该语言特性的内容(除非我看起来不太好)。

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

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

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

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

来自链接:

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

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

【问题讨论】:

    标签: rebol


    【解决方案1】:

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

    举个例子,我实现了complex! utype

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

    现在你可以重载所有动作(除了 make)和一些原生动作(数学函数、比较、表格、模子、打印、探测)

    【讨论】:

      【解决方案2】:

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

      任何有用的自定义数据类型建议通常伴随着将它们挂钩的愿望,以便它们可以有效地“重载”诸如 +append 之类的东西。有一个内部抽象层称为 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
      ]
      

      这一添加不仅允许对参数进行更细粒度的类型检查,还有助于用户更好地记录他们的代码。

      【讨论】:

        猜你喜欢
        • 2015-07-25
        • 2017-07-23
        • 1970-01-01
        • 1970-01-01
        • 2021-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多