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

Что такое синтаксис (#... #), который наблюдается в реализации стандартной библиотеки F #?

Чтение источников модуля Array2D, я наткнулся на эту интересную конструкцию в реализации многих основных функций, например:

[<CompiledName("Get")>]
let get (array: 'T[,]) (n:int) (m:int) =  (# "ldelem.multi 2 !0" type ('T) array n m : 'T #)  

Я могу только предположить, что это синтаксис для встроенного CIL и используется здесь, очевидно, для повышения производительности. Однако, когда я попытался использовать этот синтаксис в своей программе, я получаю сообщение об ошибке:

warning FS0042: This construct is deprecated: it is only for use in the F# library

Что это такое? Есть ли подробная документация?

4b9b3361

Ответ 1

Я думаю, что у этого есть 2 цели:

  • Эти функции скомпилируются с точностью до 1 инструкции CIL, которая должна быть закодирована где-то, поэтому лучше всего использовать кодировку в источнике.
  • Это позволяет сделать некоторые дополнительные обманки с определяющими полиморфными функциями Add высокопроизводительным способом, который затруднен с системой типа F #.

Фактически вы можете использовать это, но вы должны указать флаги --compiling-fslib (недокументированные) и --standalone в вашем коде.

Ответ 2

Я нашел некоторые подробности в архивах usenet: http://osdir.com/ml/lang.fsharp.general/2008-01/msg00009.html

Встраиваемый IL в коды F #. Поддерживается ли эта функция?

Не совсем. Цель этой функции 99,9% - для определенных операций в файле FSharp.Core.dll(называемый fslib.dll в 1.9.2.9 и ранее).

Исторически было полезно разрешить конечным пользователям внедрять IL в порядке для доступа к функциям .NET IL, недоступным библиотеке F # или языковые конструкции с использованием собственного встроенного ИЛ. Потребность в этом становясь намного реже, фактически почти несуществующим, теперь, когда F # библиотека созрела еще немного. Мы ожидаем, что это будет оставаться дело. Возможно даже, что мы сделаем это только для библиотеки в "продукте" версии F #, хотя мы еще не сделали окончательного решение в этом отношении.

Это было сообщение от Don Syme, датированное январем 2008 года.