Red的5种功能类型之间的差异,为什么它能区分它们?

nic*_*oro 4 rebol red

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

921*_*214 6

function!

如您所料,function!s是用户定义的函数,支持优化和类型检查,还可以包含嵌入式文档字符串。

通常,function!值与创建funcfunctiondoeshas构造,并且利用所谓的规格方言; 但是,从理论上讲,没有什么可以阻止您创建自己的构造函数或设计自己的规范格式。

还值得注意的是,它function!完全支持反思。

op!

op!s是其他4种类型的函数之上的中缀包装-它们在左侧使用一个值,在右侧使用表达式的结果,并且在求值过程中还优先使用其他函数。

op!值仅限于两个参数,不支持优化,并且对反射的支持有限(例如,您不能使用来检查其身体body-of)。

routine!

routines!在Red和Red / System(在Red运行时之上构建的低级方言)领域中都存在。他们的规范是用规范方言编写的,但是它们的主体包含Red / System代码。哦,他们支持反思。

通常它们用于图书馆的绑定(如lib中你所提到的SQL),与运行时交互,或性能瓶颈(红/系统是编译型语言,所以重写您的应用程序的性能比较-临界指数的部分为一组的routine!旨意(以强制编译为代价)给您带来了很大的提升)。

native!

native!s是用Red / System编写的函数(出于性能,简单性或可行性的考虑),并已编译为本机代码(因此命名)。除了实现细节之外,不确定是否还能对它们说些什么。native!并不是非常面向用户的,所以如果您有任何疑问,您可能需要研究Red的源代码。

action!

action!s是用Red / System编写的一组标准化函数(就像native!s 一样),每个数据类型都将其实现(或继承)为其“方法”。action!它们在第一个参数上派发的意义上是多态的:

>> add 1 2%
== 1.02
>> add 2% 1
== 102%
>> append [1] "2"
== [1 "2"]
>> append "1" [2]
== "12"
Run Code Online (Sandbox Code Playgroud)

在主流语言中,这通常看起来像"1".append([2])这样。

action!s和native!s 之间的区别归结为一种设计选择:

  • 您可以根据native!需要设置任意数量,但是action!为了提高效率,请使用s固定大小的调度表(这意味着action!每种数据类型的s的最大数量是有限的;最小数量是2:make[创建值]和mold[序列化值到string!])。

  • 从逻辑上讲,action!s在一个文件中围绕它们所属的数据类型进行组织,而native!s并不真正关心数据类型,并实现控制流,三角函数,对集合的操作等。


巧合的是,最近,我们在社区聊天中对s和s进行了类似的讨论,您可能想阅读。我还建议您浏览Rudolf Meijer的Red规范草案,当然还有官方参考文档action!native!

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