什么是原始函数、内部函数、内置函数和特殊函数? [关闭]
Posted
技术标签:
【中文标题】什么是原始函数、内部函数、内置函数和特殊函数? [关闭]【英文标题】:What are primitive, internal, builtin, and special functions? [closed] 【发布时间】:2017-03-28 07:09:30 【问题描述】:我看到一些调用 C 代码的函数被描述为 primitive
、internal
、builtin
或 special
。这些功能是什么?
【问题讨论】:
【参考方案1】:这个问题将两个不同的概念混为一谈。 special
和 builtin
是由typeof
确定的三种函数类型中的两种(以及closure
s)。
来自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
是做什么的呢?此外,x
和 c
实际上在控制台中的打印方式略有不同。以上是关于什么是原始函数、内部函数、内置函数和特殊函数? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章