Az F# programozási nyelv

Nyelvi elemek

Foglalt szavak

Az F#-ban a foglalt szavak a következők:
abstract, and, as, assert, begin, class, default, delegate, do, done, downcast, downto, else, end, enum, exception, extern, false, finally, for, fun, function, if, in, inherit, interface, land, lazy, let, match, member, module, mutable, namespace, new, null, of, open, or, override, rec, sig, static, struct, then, to, true, try, type, val, when, inline, upcast, while, with, void

A következő szavak az OCaml-al való kompatibilitás miatt védettek. Ezek használata az F# kódban nem ajánlott, mert léteznek alternatíváik: asr, land, lor, lsl, lsr, lxor, mod

A következő szimbólumok is védett szavakként értelmezhetők (a vessző csak elválasztó jel, egyik védett szóhoz se tartozik):|, ->, ->>, <-, ., :, (, ), [, ], [<, >], [|, |], {, }, #

A következõ azonosítók Ocaml-ben és/vagy C#-ban használatosak, melyek az F# jövõbeni használatára lettek lefoglalva:
async, atomic, break, checked, component, const, constraint, constructor, continue, decimal, eager, event, external, fixed, functor, include, method, mixin, object, process, property, protected, public, pure, readonly, return, sealed, virtual, volatile, {<, >}

Azonosítók

Egy F# programban használható azonosítók a következőképpen nézhetnek ki:

A fenti definícióban a Unicode karakterek alatt UTF-8 karaktereket értünk.

Literálok

String és karakter literálok

Az F#-ban két típusú string-szerű literál létezik. Az egyik a Unicode sztringek típusa ( type string = System.string) illetve az előjel nélküli byteok tömbje. ( type byte[] = bytearray)
escape-karakter := ["\'ntbr]
egyszerű-string-karakter := (bármilyen karakter, kivéve \ és ")
string-karakter :=
| trigraph
| unicodegraph-short
| unicodegraph-long
| új sor
| \ újsor whitespace*
| \ escape-karakter
| egyszerű-string-karakter
string := " string-karakter* "

Numerikus literálok

int := digit+ -- pl., 34
xint :=
  | int -- pl.: 34
  | 0 (x | X) hexdigit+ -- pl:, 0x22
  | 0 (o | O) octaldigit+ -- pl.: 0o42
  | 0 (b | B) bitdigit+ -- pl.: 0b10010


sbyte := xinty -- pl.: 34y
byte := xintuy -- pl.: 34uy
int16 := xints -- pl.: 34s
uint16 := xintus -- pl.: 34us
int32 := xintl -- pl.: 34l
uint32 := xintul -- pl.: 34ul
nativeint := xintn -- pl.: 34n
unativeint := xintun -- pl.: 34un
int64 := xintL -- pl.: 34L
uint64 := xintUL -- pl.: 34UL
ieee32 := float{F | f} -- pl.: 3.0F or 3.0f
ieee64 := float -- pl.: 3.0


bigint := intI -- pl.: 34742626263193832612536171I
bignum := intN -- pl.: 34742626263193832612536171N


bytestring := stringB
bytechar := bytecharB
float :=
  -? digit+ . digit*
  -? digit+ (. digit* )? (e | E) (+ | -)? digit+

Megjegyzések

Az F# több módszert is felkínál arra, hogy a kódot megjegyzésekkel tegyük átláthatóbbá. Használhatjuk a több soros megjegyzések írására alkalmas jelölést: ilyenkor a kommentet a (* és *) jelek közé kell írni. Fontos megjegyezni, hogy ilyenkor a megjegyzések egymásba ágyazhatók.
Létezik továbbá a C#/C++ stílusú egysoros komment, melynek jelölése: //. Ekkor minden, ami a // után van a sorban, megjegyzésnek számít.

Példa:

(* Ez egy megjegyzés. Mint az látható, lehet többsorors is. *) let tuple = (42, "Hello world!");; //Ez a kódrész mit is csinál??

Feltételes fordítás

A #if azonosító / #endif fordítási direktívák feltételes fordítási szakaszok határait határozzálk meg. A #if után elhelyezkedő kódrész akkor lesz beillesztve a fordítandó kódba, ha a megadott azonosítót már definiálták a fordítási környezetben. Ezt például a --define parancssori opcióval tehetjük meg.

Ezen felül az F# lehetőséget ad a programozónak a fordítótól függő fordítási direktívák használatára az F# és az OCaml esetében. Ha olyan kódot szeretnénk készíteni, amit OCaml és F# compilerrel is le akarunk fordítani, akkor a következő feltételes fordítási konstrukciót használhatjuk:

(*IF-FSHARP ... ENDIF-FSHARP*) //vagy (*F# ... F#*) (* A fenti két sor azt jelenti, hogy az általuk határolt kódrész akkor lesz átadva a fordítónak, ha F# fordítóval dolgozunk. Illetve az alábbi két sor valamelyikével határolt rész nem lesz átadva az F# fordítónak.*) (*IF-CAML*) ... (*ENDIF-CAML*) //vagy (*IF-OCAML*) ... (*ENDIF-OCAML*)