5

FSI 版本:11.0.50727.1

所以我正在编写一个 F# shell 脚本,我遇到了一些让我吃惊的东西。

当我这样做时:

#if INTERACTIVE
    #r "System.Data.dll"
    #r "FSharp.Data.TypeProviders.dll"
    #r "System.Data.Linq.dll"
#endif

open System

将块粘贴到 FSI 时出现 FS0010 错误。但如果我没有缩进这些#r行,则不会出现 FS0010 错误。我只是有点惊讶预处理器行对缩进敏感。这是编译器问题还是这里有其他工作?

4

2 回答 2

4

我认为规范和文档在这个主题上非常不清楚,但是规范在词法预处理器指令编译器指令之间做出了显着区别(参见§12.4):

编译器指令是非嵌套模块或命名空间声明组中的声明,格式如下:

# id string ... string

词法预处理器指令#if#else类似于编译器指令#endif#indent "off"有关#if, #else,的详细信息#endif,请参阅第 3.3 节。该#indent "off"指令在§18.4 中描述。

我的解释是,在运行主编译之前,词法预处理器指令实际上是由一些预处理器处理的,因此缩进对这些指令无关紧要。

另一方面,诸如#r,#load等指令#time稍后由编译器处理,因此它们需要匹配通常的 F# 缩进指南。

正如@unwind 所说,文档指出“缩进对于预处理器指令并不重要”,但我认为这仅适用于该文档页面上列出的预处理器指令(它们是词法预处理器指令而不是编译器指令)。

于 2012-10-30T13:00:42.547 回答
2

根据文档,它必须是其他东西在起作用:

缩进对于预处理器指令并不重要。

于 2012-10-30T12:42:43.220 回答