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

时间:2013-04-12 09:45:42

标签: f# cil

阅读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
这是什么意思?有没有详细的文件?

2 个答案:

答案 0 :(得分:20)

我认为这有两个目的:

  1. 这些函数只编译为1个CIL指令,必须在某处进行编码,因此在源处进行编码效果最佳。
  2. 它允许以高性能方式定义多态Add函数以获得一些额外的技巧,这对于F#类型系统来说很难。
  3. 您实际上可以使用此功能,但您必须在代码中指定--compiling-fslib(未记录的)和--standalone标记。

答案 1 :(得分:8)

我在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#库无法访问的.NET IL功能   语言构造使用自己的嵌入式IL。对此的需求是   变得更加罕见,实际上几乎不存在,现在F#   图书馆已经成熟了一点。我们预计这将继续成为   案件。我们甚至有可能将其作为仅限库的功能   在F#的“产品”版本中,虽然我们尚未做出决定   这方面的决定。

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