#if - #else - #endif打破F#脚本

时间:2016-09-19 20:14:21

标签: f# f#-interactive f#-scripting f#-4.0

使用F#v4.0中的Visual Studio 2015 Update 3和fsi.exe我'试图运行这个脚本:

//error.fsx

#if INTERACTIVE
    let msg = "Interactive"
#else
    let msg = "Not Interactive"
#endif

let add x y =
    x + y

printfn "%d" (add 1 2)

输出: error.fsx(12,15):错误FS0039:值或构造函数'添加'未定义

如果我然后注释掉#if - #else - #endif块,则可以正常使用:

// fixed.fsx

//#if INTERACTIVE
//    let msg = "Interactive"
//#else
//    let msg = "Not Interactive"
//#endif

let add x y =
    x + y

printfn "%d" (add 1 2)

输出: 3

我确定我做错了事(而不是这是一个错误),但我不能为我的生活找出如何使这项工作。

思想?

1 个答案:

答案 0 :(得分:4)

这是由let msg的缩进引起的。以下工作正常:

#if INTERACTIVE
let msg = "Interactive"
#else
let msg = "Not Interactive"
#endif

let add x y =
    x + y

printfn "%d" (add 1 2)

我不得不说,我不完全确定代码为什么会提供您提到的错误消息 - 我怀疑这是错误报告中的错误,它值得reporting it to the F# team。至少,应该有一个明智的错误信息!

似乎通过缩进,F#解析器实际上按如下方式解析代码:

let msg = "Interactive"
let add x y =
  x + y 
    printfn "%d" (add 1 2)

let msg之前的间距会导致编译器将printfn视为缩进。如果您使用工具提示在编辑器中查看y变量的类型,则可以看到这种情况......