What is the (# … #) syntax seen in F# standard lib

2019-08-22 06:43发布

读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

究竟这是什么道理? 是否有详细的文档?

Answer 1:

我认为,这有2个目的:

  1. 这些功能向下编译到具有在某处被编码的正好1 CIL指令,所以在源编码似乎最好。
  2. 它允许具有多态定义一些额外的挂羊头卖狗肉Add在高性能的方式,这是很难与F#类型系统的功能。

实际上,你可以使用这个,但你必须指定--compiling-fslib (无证)和--standalone在你的代码标志。



Answer 2:

我发现一些细节在新闻组档案: 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#中的“产品”版本只有库的功能,虽然我们还没有在这方面作出最后决定它甚至有可能。

这是从唐赛姆消息,日期为2008年1月。



文章来源: What is the (# … #) syntax seen in F# standard library implementation?
标签: f# cil