Директивы компилятора (F#)
В этом разделе описываются директивы процессора и директивы компилятора.
Директивы препроцессора
Директива препроцессора снабжается префиксом в виде символа # и записывается на отдельной строке. Она интерпретируется препроцессором, который выполняется перед самим компилятором.
В следующей таблице перечислены директивы препроцессора, имеющиеся в языке F#.
Директива |
Описание |
---|---|
#if символ |
Поддерживает условную компиляцию. Код во фрагменте после директивы #if включается, если определен символ. |
#else |
Поддерживает условную компиляцию. Помечает фрагмент кода для включения, если символ, используемый с предыдущей директивой #if, не определен. |
#endif |
Поддерживает условную компиляцию. Помечает конец условного фрагмента кода. |
#[строка] int, #[строка] int string, #[строка] int verbatim-string |
Указывает первоначальную строку исходного кода и имя файла для отладки. Эта возможность предусмотрена для средств, формирующих исходный код на языке F#. |
Директивы условной компиляции
Код, деактивированный одной из этих директив, в редакторе кода Visual Studio затеняется.
Примечание
Поведение директив условной компиляции отличается от поведения аналогичных директив в других языках.Например, нельзя использовать логические выражения с символами, и слова true и false не имеют никакого специального значения.Символы, используемые в директиве #if, должны быть определены из командной строки или в параметрах проекта; директивы препроцессора #define не предусмотрено.
Следующий код иллюстрирует использование директив #if, #else и #endif. В этом примере код содержит две версии определения функции function1. При определении версии VERSION1 с помощью параметра компилятора -define активируется код между директивой #if и директивой #else. В противном случае активируется код между директивой #else и директивой #endif.
#if VERSION1
let function1 x y =
printfn "x: %d y: %d" x y
x + 2 * y
#else
let function1 x y =
printfn "x: %d y: %d" x y
x - 2*y
#endif
let result = function1 10 20
Директивы препроцессора #define в F# нет. Для определения символов, используемых в директиве #if, нужно использовать параметр компилятора или параметры проекта.
Директивы условной компиляции могут быть вложенными. Отступы для директив препроцессора несущественны.
Директивы строк
При построении компилятор сообщает об ошибках в коде F#, ссылаясь на номера строк, в которых возникают ошибки. Отсчет номеров строк начинается с 1 для первой строки в файле. Однако если исходный код F# формируется из другого средства, номера строк в сформированном коде обычно не представляют интереса, поскольку ошибки в сформированном коде F#, скорее всего, проистекают из другого источника. Директива #line дает разработчикам средств, формирующих исходный код F#, возможность передавать информацию об первоначальных номерах строк и исходных файлах в сформированный код F#.
При использовании директивы #line имена файлов нужно заключать в кавычки. Если строка не предваряется лексемой буквальности (@), символы обратной косой черты в пути нужно удваивать. Ниже показаны допустимые лексемы строк. В этих примерах предполагается, что из первоначального файла Script1 при прогоне через средство получается автоматически сформированный файл кода F#, и что код в месте расположения этих директив сформирован из некоторых лексем в строке 25 файла Script1.
# 25
#line 25
#line 25 "C:\\Projects\\MyProject\\MyProject\\Script1"
#line 25 @"C:\Projects\MyProject\MyProject\Script1"
# 25 \@\"C:\Projects\MyProject\MyProject\Script1\"
Эти лексемы указывают, что код F#, сформированный в этом месте, получен из некоторых конструкций в строке 25 или рядом с нею в файле Script1.
Директивы компилятора
Директивы компилятора сходны с директивами препроцессора, поскольку они снабжаются префиксом в виде знака #, однако препроцессором они не интерпретируются, а остаются компилятору — для интерпретации и выполнения соответствующих действий.
В следующей таблице приведена директива компилятора, имеющаяся в языке F#.
Директива |
Описание |
---|---|
#light ["on"|"off"] |
Включает или отключает упрощенный синтаксис для совместимости с другими версиями языка ML. По умолчанию упрощенный синтаксис включен. Подробный синтаксис всегда включен. Поэтому можно использовать как упрощенный, так и подробный синтаксис. Директива #light сама по себе равна #light "on". Если задано значение #light "off", для всех языковых конструкций необходимо использовать подробный синтаксис. Синтаксис в документации по языку F# приводится исходя из предположения, что используется упрощенный синтаксис. Дополнительные сведения см. в разделе Подробный синтаксис (F#). |
Директивы интерпретатора (fsi.exe) см. в разделе Справочник по F# Interactive (fsi.exe).