Что такое примитивные, внутренние, встроенные и специальные функции?

Я видел, что некоторые функции, которые вызывают C-код, описываются как primitive, internal, builtin или special. Каковы эти функции?

Ответ 1

Этот вопрос объединяет два разных понятия. special и builtin являются двумя из трех типов функций (вместе с closure s), как определено typeof.

Из R-ints, 1.5 Аргумент оценки

являющийся специальным/встроенным, отличается от примитивного или .Internal: quote - специальный примитив, + встроенный примитивный, cbind - специальный. Внутренний и grep - встроенный .Internal.

Встроенный и специальный

Если функция вызывает C-код, builtin/special ссылается на то, оцениваются ли ее аргументы перед передачей C-коду.

От R-lang, 2.1.7 Встроенные объекты и специальные формы

Встроенные функции имеют все свои аргументы, которые оцениваются и передаются к внутренней функции, в соответствии с позывным, тогда как специальные функции передают неоцененные аргументы внутренняя функция.

Внутренний и примитивный

.Internal и .Primitive относятся к интерфейс, используемый для вызова C-кода. Внутренний стандарт является стандартным, поскольку вы можете проверять аргументы в R-коде перед вызовом C-кода. Примитив имеет более высокую производительность, но не позволяет использовать R-код в функции.

От R-ints, 2. Внутри против .Primitive

C-код, скомпилированный в R во время сборки, может быть вызван непосредственно в что называют примитивами или через внутренний интерфейс, который очень похож на внешний интерфейс, кроме синтаксиса. Больше точно, R поддерживает таблицу имен функций R и соответствующие функции C для вызова, которые по соглашению все начинают с 'do_ и возвратите SEXP. Эта таблица (R_FunTab в файле src/main/names.c) также указывает, сколько аргументов функции требуются или разрешены, должны ли аргументы быть или нет оценивается до вызова, и является ли функция внутренней в том смысле, что к нему необходимо получить доступ через внутренний интерфейс, или непосредственно доступным, и в этом случае он печатается в R как .Primitive.

Функции, использующие .Internal(), завернутые в закрытие, вообще предпочтительнее, поскольку это обеспечивает стандартную обработку названных и дефолтных Аргументы.

Однако, по соображениям удобства и эффективности (так как там это некоторые накладные расходы при использовании внутреннего интерфейса, завернутого в закрытие функции), примитивные функции являются исключениями, которые могут доступ к ним осуществляется напрямую.