Что такое примитивные, внутренние, встроенные и специальные функции?
Я видел, что некоторые функции, которые вызывают C-код, описаны как primitive
, internal
, builtin
, или же special
, Каковы эти функции?
1 ответ
Этот вопрос объединяет два разных понятия. special
а также builtin
два из трех типов функций (наряду с closure
s), как определено typeof
,
Из R-Ints, 1,5 Оценка аргумента
Быть специальным / встроенным отдельно от того, чтобы быть примитивом или.Internal: цитата - это специальный примитив, + - встроенный примитив, cbind - это особый. Внутренний, а grep - встроенный. Внутренний.
Встроенный против Специального
Если функция вызывает C-код, встроенная / специальная ссылка указывает на то, оцениваются ли ее аргументы перед передачей в C-код.
Из R-lang, 2.1.7 Встроенные объекты и специальные формы
Встроенные функции оценивают все свои аргументы и передают их внутренней функции в соответствии с вызовом по значению, тогда как специальные функции передают недооцененные аргументы внутренней функции.
Внутренний против Примитивного
.Internal
а также .Primitive
обратитесь к интерфейсу, используемому для вызова C-кода. Внутренний является стандартным подходом, так как вы можете проверить аргументы в R-коде, прежде чем вызывать C-код. Примитив имеет более высокую производительность, но не позволяет использовать R-код в функции.
От R-Ints, 2. Внутренний против. Примитивный
Код на C, скомпилированный в R во время сборки, может вызываться непосредственно в так называемых примитивах или через интерфейс.Internal, который очень похож на интерфейс.External, за исключением синтаксиса. Точнее, R поддерживает таблицу имен функций R и соответствующих функций C для вызова, которые по соглашению все начинаются с do_ и возвращают SEXP. Эта таблица (R_FunTab в файле src / main / names.c) также указывает, сколько аргументов функции требуется или разрешено, должны ли аргументы оцениваться перед вызовом, и является ли функция "внутренней" в смысле что он должен быть доступен через интерфейс.Internal или напрямую доступен, и в этом случае он печатается в R как.Primitive.
Функции, использующие.Internal(), заключенные в замыкание, обычно предпочтительнее, поскольку это обеспечивает стандартную обработку именованных и стандартных аргументов.
Однако по соображениям удобства, а также эффективности (поскольку при использовании интерфейса.Internal, заключенного в замыкание функции, возникают некоторые накладные расходы, примитивные функции являются исключениями, к которым можно обращаться напрямую.