【问题标题】:Are Preprocessor Directives Indentation Sensitive in F#?F# 中的预处理器指令缩进是否敏感?
【发布时间】:2012-10-30 12:40:04
【问题描述】:

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 错误。我只是有点惊讶预处理器行对缩进敏感。这是编译器问题还是这里有其他工作?

【问题讨论】:

    标签: f#


    【解决方案1】:

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

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

    # id string ... string
    

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

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

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

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

    【讨论】:

    • 谢谢托马斯。一旦我弄清楚了,就很容易解决。我只是想知道这是一个真正的问题还是我误解了什么。
    • 这是一个有趣的观点 :-) 我很好奇这是否真的在某处得到了正确的描述——规范有点帮助。
    【解决方案2】:

    根据the documentation的说法,肯定是别的什么在起作用:

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

    【讨论】:

    • 你知道放松很有趣——我查看了你链接的文档页面,但我错过了关于缩进的部分。这就是我浏览文档所得到的。
    猜你喜欢
    • 2012-08-29
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2017-06-26
    • 1970-01-01
    相关资源
    最近更新 更多