在F#标准库实现中看到的(#...#)语法是什么?

Mis*_*hor 23 f# cil

阅读Array2D模块的源代码,我在许多核心函数的实现中偶然发现了这个有趣的结构,例如:

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

我只能假设这是内联CIL的语法,这里使用它显然是为了获得性能优势.但是,当我尝试在程序中使用此语法时,出现错误:

warning FS0042: This construct is deprecated: it is only for use in the F# library
Run Code Online (Sandbox Code Playgroud)

究竟是什么?有没有详细的文件?

Joh*_*mer 20

我认为这有两个目的:

  1. 这些函数只编译为1个CIL指令,必须在某处进行编码,因此在源处进行编码似乎是最好的.
  2. 它允许以Add高性能方式定义多态函数的一些额外技巧,这对于F#类型系统来说很难.

您实际上可以使用它,但您必须在代码中指定--compiling-fslib(未记录的)和--standalone标志.


Mis*_*hor 9

我在usenet档案中找到了一些细节:http://osdir.com/ml/lang.fsharp.general/2008-01/msg00009.html

在F#代码中嵌入IL.是否正式支持此功能

并不是的.此功能的99.9%用于FSharp.Core.dll中定义的操作(在1.9.2.9及之前称为fslib.dll).

从历史上看,允许最终用户嵌入IL以便访问F#库或使用自己的嵌入式IL的语言结构无法访问的.NET IL功能是非常有用的.由于F#库已经成熟了一些,因此对此的需求变得越来越罕见,实际上几乎不存在.我们希望情况继续如此.我们甚至有可能在F#的"产品"版本中将其作为仅限库的功能,尽管我们尚未在这方面做出最终决定.

这是来自Don Syme的消息,日期为2008年1月.