rebol - Red 的 5 种函数类型之间的区别,为什么要区分它们?

标签 rebol red

在红色中,有数据类型function!的函数, op! , native! , routine!action! .它们之间有什么区别?据我所知function!用于用户定义的函数和op!对于中缀运算符和 routine!对于 Red/System 中定义的函数,但是为什么还需要另外两个呢?

最佳答案

function!
正如您自己猜到的, function! 是用户定义的函数,支持细化和类型检查,还可以包含嵌入的文档字符串。

通常, function! 值是使用 funcfunctiondoeshas 构造函数创建的,并使用所谓的规范方言;但是,理论上,没有什么能阻止您制作自己的构造函数或设计自己的规范格式。

还值得注意的是 function! 完全支持反射。
op!op! 是其他 4 种函数顶部的中缀包装器 - 它们在左侧采用一个值,在右侧采用表达式的结果,并且在评估期间它们也优先于其他函数。
op! 值仅限于两个参数,不支持细化,并且对反射的支持有限(例如,您不能使用 body-of 检查它们的主体)。
routine!routines! 存在于 Red 和 Red/System(构建 Red 运行时的底层方言)的两个领域。他们的规范是用规范方言编写的,但他们的正文包含红色/系统代码。哦,他们支持反射(reflection)。

通常它们用于库绑定(bind)(如您提到的 SQL 库)、与运行时的交互或性能瓶颈(Red/System 是一种编译语言,因此将应用程序的性能关键部分重写为一组 routine! s将以强制编译为代价给您带来显着的提升)。
native!native! 是用 Red/System 编写的函数(出于性能、简单性或可行性的原因)并编译为 native 代码(因此得名)。不知道除了实现细节之外还能说些什么。 native! 不是非常面向用户的,因此您可能需要研究 Red 的源代码,以防您有任何问题。
action!action! 是用 Red/System 编写的一组标准化函数(就像 native! 一样),每个数据类型都将其实现(或继承)作为其“方法”。 action! 在某种意义上是多态的,它们在第一个参数上调度:

>> add 1 2%
== 1.02
>> add 2% 1
== 102%
>> append [1] "2"
== [1 "2"]
>> append "1" [2]
== "12"

在主流语言中,这通常看起来像 "1".append([2]) 或类似的东西。
action! s 和 native! s 之间的区别归结为设计选择:
  • 你可以有尽可能多的 native! ,但是为了效率,action! 有一个固定大小的调度表(这意味着每个数据类型的 action! 的最大数量是有限的;最小数量是两个:make [创造值(value)]和 mold [将值序列化为 string! ])。
  • 逻辑上,action! 围绕它们所属的数据类型组织在一个文件中,而 native! 并不真正关心数据类型,并实现控制流、三角函数、集合上的操作等。


  • 巧合的是,就在最近,我们的社区聊天中有一个关于 action!native!similar discussion,您可能想阅读一下。我还可以推荐浏览一下 Rudolf Meijer 的 Red specification 草稿,当然还有 official reference documentation

    至于您的问题中的“为什么”- 5 种类型之间的区别只是一个实现细节,继承自 Rebol。从逻辑上讲,它们都实现了从概念角度可能称为“功能”的东西,并且属于 any-function! 阵营。

    关于rebol - Red 的 5 种函数类型之间的区别,为什么要区分它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55832308/

    相关文章:

    rebol - 如何使用 Rebol 在 block 内创建子 block

    networking - 如何处理 Rebol 3 方案中的超时时间

    rebol - 如果有的话,在 Red 中应用 Rebol 的等效项是什么?

    rebol - 日期减法为什么我得不到hh :mm:ss in Rebol/Red?

    directory - 如何使用纯 Red 语言存储目录文件列表?

    curl - 从 rebol 或 red 调用curl 不起作用

    regex - 从 Red 语言的字符串中删除特殊字符

    object - 如何避免 Rebol 中的对象函数和全局函数之间的名称冲突?

    recursion - 打破递归函数

    constructor - TO 和 MAKE 的目的有何不同,它们记录在何处?