Что такое синтаксис (#... #), который наблюдается в реализации стандартной библиотеки 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
Что это такое? Есть ли подробная документация?
Ответы
Ответ 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 года.