Interaktivní programování s použitím F #

F# Interactive (dotnet FSI) se používá ke interaktivnímu spuštění kódu F # v konzole nebo ke spouštění skriptů F #. Jinými slovy, F # Interactive spustí REPL (čtení, vyhodnocení, tisk smyčky) pro F #.

Chcete-li spustit F# Interactive z konzoly, spusťte dotnet fsi příkaz. Najdete dotnet fsi ho v libovolné sadě .NET SDK.

Informace o dostupných možnostech příkazového řádku naleznete v tématu F# Interactive Options.

Provádění kódu přímo v F# Interactive

Vzhledem k tomu, že F# Interactive je REPL (čtení-Eval-Print Loop), můžete v něm interaktivně spustit kód. Tady je příklad interaktivní relace po spuštění dotnet fsi z příkazového řádku:

Microsoft (R) F# Interactive version 11.0.0.0 for F# 5.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

For help type #help;;

> let square x = x *  x;;
val square : x:int -> int

> square 12;;
val it : int = 144

> printfn "Hello, FSI!"
- ;;
Hello, FSI!
val it : unit = ()

Všimněte si dvou hlavních věcí:

  1. Veškerý kód musí být ukončen s dvojitým středníkem ( ;; ), který se má vyhodnotit.
  2. Kód je vyhodnocen a uložen v it hodnotě. Můžete odkazovat it interaktivně.

F# Interactive podporuje také Víceřádkový vstup. Stačí pouze ukončit odeslání pomocí dvojité středníku ( ;; ). Vezměte v úvahu následující fragment kódu, který byl vložen do a vyhodnocován pomocí F# Interactive:

> let getOddSquares xs =
-     xs
-     |> List.filter (fun x -> x % 2 <> 0)
-     |> List.map (fun x -> x * x)
-
- printfn "%A" (getOddSquares [1..10]);;
[1; 9; 25; 49; 81]
val getOddSquares : xs:int list -> int list
val it : unit = ()

>

Formátování kódu se zachová a dvojité střední ( ;; ) ukončí vstup. F# Interactive pak vyhodnotí kód a vytiskli výsledky.

Skriptování pomocí jazyka F#

Interaktivní vyhodnocení kódu v F# Interactive může být skvělým výukovým nástrojem, ale rychle zjistíte, že není tak produktivní jako psaní kódu v normálním editoru. Pro podporu normálního úprav kódu můžete psát skripty F #.

Skripty používají příponu souboru . fsx. Namísto kompilování zdrojového kódu a pozdějšího spuštění zkompilovaného sestavení můžete pouze spustit dotnet FSI a zadat název souboru skriptu zdrojového kódu f # a jazyk f # Interactive přečte kód a provede jej v reálném čase. Zvažte například následující skript s názvem Script.fsx :

let getOddSquares xs =
    xs
    |> List.filter (fun x -> x % 2 <> 0)
    |> List.map (fun x -> x * x)

printfn "%A" (getOddSquares [1..10])

Když se tento soubor vytvoří v počítači, můžete ho spustit pomocí dotnet fsi a zobrazit výstup přímo v okně terminálu:

dotnet fsi Script.fsx
[1; 9; 25; 49; 81]

skriptování F # je nativně podporováno v Visual Studio, Visual Studio Codea Visual Studio pro Mac.

Odkazy na balíčky v F# Interactive

Poznámka

Systém správy balíčků je rozšiřitelný.

F# Interactive podporuje odkazování na #r "nuget:" NuGet balíčky se syntaxí a volitelnou verzí:

#r "nuget: Newtonsoft.Json"
open Newtonsoft.Json

let data = {| Name = "Don Syme"; Occupation = "F# Creator" |}
JsonConvert.SerializeObject(data)

Pokud není zadána verze, je proveden nejvyšší dostupný balíček bez náhledu. Chcete-li odkazovat na konkrétní verzi, zaveďte tuto verzi pomocí čárky. To může být užitečné při odkazování na verzi Preview balíčku. Představte si třeba tento skript pomocí verze Preview služby DiffSharp:

#r "nuget: DiffSharp-lite, 1.0.0-preview-328097867"
open DiffSharp

// A 1D tensor
let t1 = dsharp.tensor [ 0.0 .. 0.2 .. 1.0 ]

// A 2x2 tensor
let t2 = dsharp.tensor [ [ 0; 1 ]; [ 2; 2 ] ]

// Define a scalar-to-scalar function
let f (x: Tensor) = sin (sqrt x)

printfn $"{f (dsharp.tensor 1.2)}"

Určení zdroje balíčku

Můžete také zadat zdroj balíčku pomocí #i příkazu. Následující příklad určuje vzdálený a místní zdroj:

#i "nuget: https://my-remote-package-source/index.json"
#i """nuget: C:\path\to\my\local\source"""

Tím se nástroj pro rozlišení v rámci pokrývá a vezme v úvahu také vzdálené a/nebo místní zdroje přidané do skriptu.

Ve skriptu můžete zadat tolik odkazů na balíčky, kolik chcete.

Poznámka

V současné době je omezení pro skripty, které používají odkazy na rozhraní (např. Microsoft.NET.Sdk.Web nebo Microsoft.NET.Sdk.WindowsDesktop ). Balíčky jako Saturn, Giraffe, WinForms nejsou k dispozici. Sleduje se při potížích #9417.

Odkazování na sestavení na disku pomocí F # Interactive

Případně, pokud máte sestavení na disku a chcete se na něj odkazovat ve skriptu, můžete použít #r syntaxi k určení sestavení. Zvažte následující kód v projektu zkompilovaném do MyAssembly.dll :

// MyAssembly.fs
module MyAssembly
let myFunction x y = x + 2 * y

Po zkompilování můžete na něj odkazovat v souboru s názvem Script.fsx , například:

#r "path/to/MyAssembly.dll"

printfn $"{MyAssembly.myFunction 10 40}"

Výstup je následující:

dotnet fsi Script.fsx
90

Ve skriptu můžete zadat tolik odkazů na sestavení, kolik chcete.

Načítají se další skripty.

Při skriptování může být často užitečné použít pro různé úlohy různé skripty. Někdy lze chtít znovu použít kód z jednoho skriptu v jiném. Místo kopírování – vkládání obsahu do souboru ho můžete jednoduše načíst a vyhodnotit pomocí #load .

Vezměte v úvahu následující Script1.fsx skutečnosti:

let square x = x * x

A spotřebovávatelné soubory Script2.fsx :

#load "Script1.fsx"
open Script1

printfn $"%d{square 12}"

Můžete vyhodnotit Script2.fsx jako:

dotnet fsi Script2.fsx
144

Ve skriptu můžete zadat tolik direktiv, kolik #load chcete.

Poznámka

open Script1Deklarace je povinná. Důvodem je, že konstrukce ve skriptu jazyka F # jsou zkompilovány do modulu nejvyšší úrovně, který je název souboru skriptu, ve kterém je. Pokud má soubor skriptu malý název, například script3.fsx , název implicitního modulu je automaticky velkými písmeny a bude nutné použít open Script3 . Pokud chcete definovat konstrukce v konkrétním oboru názvů modulu, můžete zahrnout obor názvů deklarace modulu, například:

module MyScriptLibrary

fsiPoužívání objektu v kódu F #

Skripty F # mají přístup k vlastnímu fsi objektu, který představuje relaci F# Interactive. Umožňuje přizpůsobit například formátování výstupu. Také je možné přistupovat k argumentům příkazového řádku.

Následující příklad ukazuje, jak získat a použít argumenty příkazového řádku:

let args = fsi.CommandLineArgs

for arg in args do
    printfn $"{arg}"

Při vyhodnocování se zobrazí všechny argumenty. První argument je vždy název vyhodnoceného skriptu:

dotnet fsi Script1.fsx hello world from fsi
Script1.fsx
hello
world
from
fsi

Pro přístup ke stejným argumentům můžete použít System.Environment.GetCommandLineArgs() také.

Referenční informace k direktivě F# Interactive

#rVýše popsané direktivy a #load jsou dostupné jenom v F# Interactive. V F# Interactive je k dispozici několik direktiv:

Směrnici Description
#r "nuget:..." Odkazuje na balíček z NuGet
#r "assembly-name.dll" Odkazuje na sestavení na disku.
#load "file-name.fsx" Přečte zdrojový soubor, zkompiluje jej a spustí.
#help Zobrazí informace o dostupných direktivách.
#I Určí vyhledávací cestu k sestavení v uvozovkách.
#quit Ukončí relaci jazyka F# Interactive.
#time "on" nebo #time "off" Sám o sobě přepíná, #time zda se mají zobrazovat informace o výkonu. Pokud je "on" , F# Interactive míry v reálném čase, čas procesoru a informace o uvolňování paměti pro každý oddíl kódu, který je interpretován a proveden.

Pokud v jazyce F# Interactive určíte soubory nebo cesty, očekává se textový literál. Proto musí být soubory a cesty v uvozovkách a musí být použity obvyklé řídicí znaky. Znak můžete použít @ k vygenerování F# Interactive k interpretaci řetězce, který obsahuje cestu jako doslovného řetězce. To způsobí, že jazyk F# Interactive ignoruje jakékoli řídicí znaky.

Interaktivní a zkompilované direktivy preprocesoru

Pokud kompilujete kód v F# Interactive bez ohledu na to, jestli používáte interaktivně nebo spuštěný skript, je definovaný symbol Interactive . Při kompilaci kódu v kompilátoru je definován symbol kompilovaný . Proto pokud kód musí být v kompilovaných a interaktivních režimech jiný, můžete použít tyto direktivy preprocesoru pro podmíněnou kompilaci k určení, které chcete použít. Například:

#if INTERACTIVE
// Some code that executes only in FSI
// ...
#endif

Použití F# Interactive v Visual Studio

pokud chcete spustit F# Interactive prostřednictvím Visual Studio, můžete kliknout na příslušné tlačítko panelu nástrojů s označením F# Interactivenebo použít klávesy Ctrl + Alt + F. Tím otevřete interaktivní okno nástroje, ve kterém běží relace jazyka F# Interactive. Můžete také vybrat nějaký kód, který chcete spustit v interaktivním okně, a stisknout kombinaci kláves ALT + ENTER. F# Interactive se spustí v okně nástroje s označením F# Interactive. Použijete-li tuto kombinaci kláves, ujistěte se, že má okno editoru fokus.

Pokud používáte konzolu nebo sadu Visual Studio, zobrazí se příkazový řádek a překladač čeká na zadání. Zde je možné zadat kód stejně jako v souboru kódu. Pokud chcete kód zkompilovat a spustit, zadáním dvou středníků (;;) ukončete řádek nebo několik řádků vstupu.

Jazyk F# Interactive se pokusí zkompilovat kód a v případě úspěchu kód spustí a vytiskne podpis zkompilovaných typů a hodnot. Pokud dojde k chybám, překladač vytiskne chybové zprávy.

Kód zadaný ve stejné relaci má přístup k libovolné konstrukci zadané dříve, takže lze sestavit programy. Rozsáhlá vyrovnávací paměť okna nástroje umožňuje v případě potřeby zkopírovat kód do souboru.

Při spuštění v sadě Visual Studio se jazyk F# Interactive spustí nezávisle na projektu, tedy například nelze použít konstrukce definované v projektu v jazyce F# Interactive, pokud nezkopírujete kód této funkce do interaktivního okna.

Úpravou nastavení můžete F# Interactive argumenty příkazového řádku (možnosti). V nabídce Nástroje vyberte Možnosti... a pak rozbalte F# Nástroje. Dvě nastavení, která můžete změnit, jsou možnosti F# Interactive a 64bitové nastavení F# Interactive , které je relevantní pouze v případě, že používáte F# Interactive na 64bitovém počítači. Toto nastavení určuje, jestli chcete spustit vyhrazenou 64bitovou verzi nástroje fsi.exe nebo fsianycpu.exe, která pomocí architektury počítače určuje, jestli se má spustit jako 32bitový nebo 64bitový proces.

Nadpis Popis
Interaktivní možnosti F# Popisuje syntaxi příkazového řádku a možnosti pro F# Interactive fsi.exe.