Как работает F # inline?
С F # я понимаю, что вы можете использовать ключевое слово inline для выполнения специализации типов на сайте вызова. Это::
val inline (+) : ^a -> ^b -> ^c
when (^a or ^b) : (static member (+) : ^a * ^b -> ^c)
Ограничения, которые ^a
или ^b
должны иметь статический член типа op_Addition
или один из встроенных примитивов, который может быть использован для заполнения пробела.
Итак, если у вас есть метод, который имеет +, и вы передаете int и короткие как параметры, он распаковывает + в команду для использования встроенного примитива для int, и если вы передаете поплавок и байт, использует код операции добавления примитива с поплавком.
Как именно это делается во время компиляции? Как вы можете использовать метод в среде CLR, который переключает какой код операции или метод, который он использует на основе типа?
Возможно ли такое поведение с Reflection.Emit?
Я понимаю, что inlining выполняется на сайте call-сайта, означает ли это, что код не работает с С#?
Ответы
Ответ 1
Как было предложено inline
, код встроен на сайт вызова. На каждом сайте вызова вы знаете конкретный тип параметра ^T
, поэтому туда вводится конкретный код для этого типа.
Это выполняется компилятором F #, вы не можете легко сделать это в другом контексте (например, С# или Ref.Emit).
Библиотека F # имеет ряд встроенных функций, которые все еще могут вызываться другими языками, среда выполнения для этих реализаций выполняет динамическую диспетчеризацию на основе типа среды выполнения, см., например, код AdditionDynamic
в prim-types.fs
в коде библиотеки F # Core, чтобы получить представление.