Как работает F # inline? - PullRequest
       18

Как работает F # inline?

12 голосов
/ 11 декабря 2010

Насколько я понимаю, с помощью F # вы можете использовать встроенное ключевое слово для выполнения специализации типов на сайте вызовов. То есть ::

val inline (+) : ^a -> ^b -> ^c
      when (^a or ^b) : (static member (+) : ^a * ^b -> ^c)

Ограничивает, что ^a или ^b должны иметь статический член, такой как op_Addition, или один из встроенных примитивов, который можно использовать для заполнения пробела.

Так что если у вас есть метод, который имеет + и вы передаете int и short в качестве параметров, он разворачивает + в инструкцию, чтобы использовать встроенный примитив для int, и если вы передаете float и byte it использует опт-код сложного примитива.

Как именно это делается во время компиляции? Как вы можете иметь метод в CLR, который переключает, какой код операции или метод он использует в зависимости от типа?

Возможно ли такое поведение с Reflection.Emit? Я понимаю, что встраивание выполняется на call-сайте, означает ли это, что код не работает с C #?

1 Ответ

9 голосов
/ 11 декабря 2010

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

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

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

...