在红色中,有数据类型function!
的函数, op!
, native!
, routine!
和 action!
.它们之间有什么区别?据我所知function!
用于用户定义的函数和op!
对于中缀运算符和 routine!
对于 Red/System
中定义的函数,但是为什么还需要另外两个呢?
最佳答案
function!
正如您自己猜到的, function!
是用户定义的函数,支持细化和类型检查,还可以包含嵌入的文档字符串。
通常, function!
值是使用 func
、 function
、 does
和 has
构造函数创建的,并使用所谓的规范方言;但是,理论上,没有什么能阻止您制作自己的构造函数或设计自己的规范格式。
还值得注意的是 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/