2016-09-19 12 views
1

с помощью Visual Studio 2015 Update 3 и fsi.exe от F # v4.0 Я пытаюсь запустить этот скрипт:#if - #else - #endif нарушение F # Script

//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) 

Выход:

Я уверен, что я делаю что-то неправильно (а не что является ошибкой), но я не могу за жизнь мне понять, как сделать это Работа.

Мысли?

ответ

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 в своем редакторе с помощью подсказки инструмента ...

+0

Спасибо Tomas! Как только вы это указали, это имело смысл. Я схватил код примера из [здесь] (http://brandewinder.com/2016/02/06/10-fsharp-scripting-tips/) (№ 3) и только предположил, что он будет работать именно так. Большое спасибо! –

+0

Это смешная ошибка - я потратил немного больше времени, чтобы понять, что происходит, и я думаю, что это ошибка (по крайней мере, в сообщениях об ошибках). –

+0

Мэтт Клейн: сожалею об этом! Я исправлю сообщение, возможно, некоторые форматирования были искалечены. – Mathias

 Смежные вопросы

  • Нет связанных вопросов^_^