Pytanie Jaka jest składnia (# ... #) widoczna w implementacji standardowej biblioteki F #?


Czytając źródła modułu Array2D natknąłem się na tę interesującą konstrukcję w implementacji wielu podstawowych funkcji, na przykład:

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

Mogę tylko założyć, że jest to składnia wbudowanego CIL i jest używana tutaj oczywiście w celu uzyskania korzyści wydajności. Jednak gdy próbuję użyć tej składni w moim programie, pojawia się błąd:

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

Czym dokładnie jest to? Czy jest jakaś szczegółowa dokumentacja?


21
2018-04-12 09:45


pochodzenie


wygląda mi na zdziwioną twarz - Raptor
Rozumiem ciekawość, ale zabiorę ostrzeżenie, że jest to tylko do użytku w bibliotece F # jako znak, że to nic, czego nikt z nas nie potrzebuje :-) - Onorio Catenacci
Możesz zamieścić to, co znalazłeś jako odpowiedź, zamiast edytować je w pytaniu. - svick
Fajnie, zredagowałem pytanie i przeniosłem tę część do odpowiedzi. - MisterMetaphor


Odpowiedzi:


Myślę, że ma to 2 cele:

  1. Te funkcje kompilują się do dokładnie 1 instrukcji CIL, która musi być zakodowana gdzieś, więc najlepiej jest kodować u źródła.
  2. Pozwala na dodatkowe oszustwa z definiowaniem polimorfizmu Add działa w sposób wysoce wydajny, co jest trudne w systemie typu F #.

Możesz go użyć, ale musisz podać --compiling-fslib (nieudokumentowane) i --standalone flagi w kodzie.


20
2018-04-12 09:52



Wspaniały! Gdzie się dowiedziałeś o opcjach kompilatora? - MisterMetaphor
@ e-i-s - Istnieje plik źródłowy, który ma je wszystkie gdzieś - nie do końca pewny, gdzie - szukając źródła standalone prawdopodobnie pomoże - John Palmer


Znalazłem kilka szczegółów w archiwach usenet: http://osdir.com/ml/lang.fsharp.general/2008-01/msg00009.html

Osadzone IL w kodach F #. Czy ta funkcja jest oficjalnie obsługiwana

Nie całkiem. 99,9% tej funkcji dotyczy zdefiniowanych operacji   w pliku FSharp.Core.dll (zwanym fslib.dll w wersji 1.9.2.9 i wcześniejszej).

Historycznie użyteczne było umożliwienie użytkownikom końcowym osadzania IL w porządku   dostęp do funkcji .NET IL niedostępnych w bibliotece F # lub   konstruuje język za pomocą własnej wbudowanej IL. Potrzeba tego jest   stając się o wiele rzadszym, a wręcz prawie nieistniejącym, teraz, gdy F #   biblioteka dojrzała nieco więcej. Oczekujemy, że będzie to nadal   walizka. Jest nawet możliwe, że zrobimy to z funkcji tylko biblioteki   w wersji "produktu" F #, choć nie mamy jeszcze finału   decyzja w tym zakresie.

To była wiadomość od Don Syme z stycznia 2008 roku.


8
2018-04-13 18:02