Подтвердить что ты не робот

Как работает 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-сайта, означает ли это, что код не работает с С#?

4b9b3361

Ответ 1

Как было предложено inline, код встроен на сайт вызова. На каждом сайте вызова вы знаете конкретный тип параметра ^T, поэтому туда вводится конкретный код для этого типа.

Это выполняется компилятором F #, вы не можете легко сделать это в другом контексте (например, С# или Ref.Emit).

Библиотека F # имеет ряд встроенных функций, которые все еще могут вызываться другими языками, среда выполнения для этих реализаций выполняет динамическую диспетчеризацию на основе типа среды выполнения, см., например, код AdditionDynamic в prim-types.fs в коде библиотеки F # Core, чтобы получить представление.