#if - #else - #endif ломая скрипт F#

Использование Visual Studio 2015 с обновлением 3 и fsi.exe из F# v4.0 я пытаюсь запустить этот скрипт:

//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: значение или конструктор add не определены

Если я тогда закомментирую #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 ответ

Решение

Это вызвано отступом let msg, Следующее работает отлично:

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

let add x y =
    x + y

printfn "%d" (add 1 2)

Я должен сказать, я не совсем уверен, почему код выдает именно то сообщение об ошибке, о котором вы упомянули, - я подозреваю, что это ошибка в сообщении об ошибке, и стоило бы сообщить об этом команде F#. По крайней мере, должно быть разумное сообщение об ошибке!

Кажется, что с отступом синтаксический анализатор F# фактически анализирует код следующим образом:

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

Расстояние до let msg заставляет компилятор лечить printfn как с отступом тоже. Вы можете видеть, что это так, если вы посмотрите на тип y переменная в вашем редакторе с помощью всплывающей подсказки...

Другие вопросы по тегам