什么是原始函数、内部函数、内置函数和特殊函数? [关闭]

Posted

技术标签:

【中文标题】什么是原始函数、内部函数、内置函数和特殊函数? [关闭]【英文标题】:What are primitive, internal, builtin, and special functions? [closed] 【发布时间】:2017-03-28 07:09:30 【问题描述】:

我看到一些调用 C 代码的函数被描述为 primitiveinternalbuiltinspecial。这些功能是什么?

【问题讨论】:

【参考方案1】:

这个问题将两个不同的概念混为一谈。 specialbuiltin 是由typeof 确定的三种函数类型中的两种(以及closures)。

来自R-ints, 1.5 Argument evaluation

作为一个特殊的/内置的与原始的或 .Internal:quote 是一个特殊的原语,+ 是内置的 原始的, cbind 是一个特殊的 .Internal 和 grep 是一个内置 。内部的。

内置与特殊

如果函数调用 C 代码,内置/特殊是指在传递给 C 代码之前是否评估其参数。

来自R-lang, 2.1.7 Builtin objects and special forms

内置函数的所有参数都被评估和传递 到内部函数,按照按值调用, 而特殊函数将未计算的参数传递给 内部功能。

内部与原始

.Internal.Primitive指的是用来调用C代码的接口。内部是标准方法,因为您可以在调用 C 代码之前检查 R 代码中的参数。 Primitive 性能更高,但不允许在函数中使用任何 R 代码。

来自R-ints, 2 .Internal vs .Primitive

在构建时编译成 R 的 C 代码可以直接在 什么被称为原语或通过 .Internal 接口,其中 除了语法之外,它与 .External 接口非常相似。更多的 准确地说,R 维护了一个 R 函数名称表和 要调用的相应 C 函数,按照惯例,所有函数都开始 使用“do_”并返回 SEXP。此表(文件中的 R_FunTab src/main/names.c) 还指定函数的参数数量 是必需的还是允许的,无论论点是否是 在调用之前评估,以及函数是否为“内部” 从某种意义上说,它必须通过 .Internal 接口访问, 或直接可访问,在这种情况下,它在 R 中打印为 .原始的。

使用 .Internal() 包裹在闭包中的函数通常是 首选,因为这确保了命名和默认的标准处理 论据。

但是,出于方便和效率的原因(如 使用 .Internal 接口的一些开销 函数闭包),原始函数是异常,可以 可以直接访问。

【讨论】:

你写了很棒的 [r-faq] 帖子,但你为什么要让它们成为社区维基?您已经为此花费了大量的时间和精力,为什么要否认作为答案赞成票的一部分给予您的少量代表?或者你想向其他人发出信号,这是我写的,请继续改进它 @BhargavRao 是的,我希望其他人改进它!如果它被标记为r-faq,那么获得社区满意的答案很重要。我从其他答案中得到了很多分数。 还有更多:一些原语在 R 中定义为函数,另一些直接定义为 .Primitive 对象。你能扩大差异吗?我尝试过寻找解释,并在 R 中进行实验,但不明白。例如,​`+`​ 被定义为 函数,而 ​`(`​return 不是(尽管可以调用)。 @KonradRudolph 这些东西就是函数。看看is.function(`(`)is.function(return)。不知道为什么他们的打印方法只是说.Primitive() @RichieCotton 是的,这就是我所指的:它们当然是函数,但它们的 R 定义看起来不像函数。实际上是另一种方式:.Primitive(…) 返回一个函数。因此,我不明白(例如)c 是如何工作的:例如,如果我复制它的定义并将其分配给不同的变量,则结果不起作用:x = function(...) .Primitive("c"); x(1, 2) 返回.Primitive("c")。相比之下,如果我直接定义y = .Primitive("c"),它就可以工作。那么c 是做什么的呢?此外,xc 实际上在控制台中的打印方式略有不同。

以上是关于什么是原始函数、内部函数、内置函数和特殊函数? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

python之迭代器生成器和内置函数,匿名函数

面向对象结构与成员(特殊成员)及相关内置函数

递归与内置函数

了解如何从内部函数更新原始二维数组

函数内部两个特殊的对象---arguments和this

python函数:内置函数和匿名函数