#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
переменная в вашем редакторе с помощью всплывающей подсказки...