다음을 통해 공유


F를 사용한 대화형 프로그래밍#

F# 대화형(dotnet fsi)은 콘솔에서 F# 코드를 대화형으로 실행하거나 F# 스크립트를 실행하는 데 사용됩니다. 즉, F# 대화형은 F#용 REPL(읽기, 평가, 인쇄 루프)을 실행합니다.

콘솔에서 F# Interactive를 실행하려면 dotnet fsi실행합니다. 모든 .NET SDK에서 dotnet fsi 찾을 수 있습니다.

메모

.NET Framework 런타임에서 F# 대화형을 사용하려면 Visual Studio 빌드 도구 또는 Visual Studio 버전이 설치되어 있어야 하며, "개발자 명령 프롬프트"에서 FsiAnyCPU.exe 명령을 호출하거나 dotnet fsi 명령줄 대신 PATH 환경 변수에서 FsiAnyCPU.exe 사용할 수 있도록 합니다.

도구는 F# Interactive 런타임 버전 정의를 지원합니다.

  • Visual Studio: 메뉴 모음에서 도구 / 옵션를 선택한 다음 F# 도구 / F# 대화형으로 이동하여 .NET Core 스크립팅사용하기를 조정합니다.
  • Visual Studio Code(ionide 확장):명령 팔레트에서 기본 설정: 사용자 설정 열고 F#F#확장기본 설정: Fsi Sdk 파일 경로.

사용 가능한 명령줄 옵션에 대한 자세한 내용은 F# 대화형 옵션참조하세요.

F# Interactive에서 직접 코드 실행

F# Interactive는 REPL(읽기-평가-출력 루프)이므로 코드를 인터랙티브하게 실행할 수 있습니다. 명령줄에서 dotnet fsi 실행한 후 대화형 세션의 예는 다음과 같습니다.

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 = ()

다음 두 가지 주요 사항을 확인할 수 있습니다.

  1. 평가하려면 모든 코드를 더블 세미콜론(;;)으로 종료해야 합니다.
  2. 코드가 평가되고 it 값에 저장됩니다. 대화형으로 it 참조할 수 있습니다.

F# Interactive는 여러 줄 입력도 지원합니다. 이중 세미콜론(;;)으로 제출을 종료하면 됩니다. 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 = ()

>

코드의 서식은 유지되며 입력을 종료하는 이중 세미콜론(;;)이 있습니다. 그런 다음 F# Interactive에서 코드를 평가하고 결과를 출력했습니다.

F를 사용하여 스크립팅#

F# Interactive에서 코드를 대화형으로 평가하는 것은 훌륭한 학습 도구일 수 있지만 일반 편집기에서 코드를 작성하는 것만큼 생산적이지 않다는 것을 빠르게 알게 될 것입니다. 일반 코드 편집을 지원하기 위해 F# 스크립트를 작성할 수 있습니다.

스크립트는 .fsx파일 확장자를 사용합니다. 소스 코드를 컴파일한 다음 나중에 컴파일된 어셈블리를 실행하는 대신 dotnet fsi 실행하고 F# 소스 코드 스크립트의 파일 이름을 지정하면 F# 대화형에서 코드를 읽고 실시간으로 실행할 수 있습니다. 예를 들어 'Script.fsx'라는 스크립트를 고려해 보세요.

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

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

컴퓨터에서 이 파일을 만들 때 dotnet fsi 사용하여 실행하고 터미널 창에서 직접 출력을 볼 수 있습니다.

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

F# 스크립팅은 Visual StudioVisual Studio Code에서 기본적으로 지원됩니다.

F# Interactive에서 패키지 참조

메모

패키지 관리 시스템은 확장 가능하며 플러그 인 및 확장 메커니즘대한 자세한 내용을 참조하세요.

5.0 언어 릴리스 이후 F# Interactive는 확장성 메커니즘을 통해 패키지 참조를 지원합니다. 기본적으로 #r "nuget:" 구문 및 선택적 버전을 사용하여 NuGet 패키지를 참조할 수 있습니다.

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

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

버전을 지정하지 않으면 사용 가능한 가장 높은 비 미리 보기 패키지가 수행됩니다. 특정 버전을 참조하려면 쉼표로 버전을 소개합니다. 패키지의 미리 보기 버전을 참조할 때 유용할 수 있습니다. 예를 들어 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)}"

패키지 원본 지정

#i 명령을 사용하여 패키지 원본을 지정할 수도 있습니다. 다음 예제에서는 원격 및 로컬 원본을 지정합니다.

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

그러면 스크립트에 추가된 원격 및/또는 로컬 원본도 고려하도록 덮개 아래의 해상도 엔진에 지시합니다.

스크립트에서 원하는 만큼 패키지 참조를 지정할 수 있습니다.

메모

현재 프레임워크 참조(예:Microsoft.NET.Sdk.Web 또는 Microsoft.NET.Sdk.WindowsDesktop)를 사용하는 스크립트에는 제한이 있습니다. 토성, 기린, WinForms와 같은 패키지는 사용할 수 없습니다. 이는 #9417문제에서 추적되고 있습니다. WinForms는 여전히 F# Interactive의 .NET Framework 버전에서 작동합니다.

SDK 및/또는 도구와 함께 제공된 확장 옆에 추가 확장을 로드하려면 F# 대화형 세션(또는 도구 설정)에 대한 인수로 --compilertool:<extensionsfolderpath> 플래그를 사용합니다.

F# 대화형으로 디스크의 어셈블리 참조

또는 디스크에 어셈블리가 있고 스크립트에서 해당 어셈블리를 참조하려는 경우 #r 구문을 사용하여 어셈블리를 지정할 수 있습니다. MyAssembly.dll컴파일된 프로젝트에서 다음 코드를 고려합니다.

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

컴파일되면 다음과 같이 Script.fsx 파일에서 참조할 수 있습니다.

#r "path/to/MyAssembly.dll"

printfn $"{MyAssembly.myFunction 10 40}"

출력은 다음과 같습니다.

dotnet fsi Script.fsx
90

스크립트에서 원하는 만큼 어셈블리 참조를 지정할 수 있습니다.

다른 스크립트 로드

스크립팅할 때 여러 작업에 서로 다른 스크립트를 사용하는 것이 유용할 수 있습니다. 경우에 따라 한 스크립트의 코드를 다른 스크립트에서 다시 사용하려고 할 수 있습니다. 파일에 내용을 복사하여 붙여넣는 대신 #load사용하여 로드하고 평가할 수 있습니다.

다음의 Script1.fsx을 고려하십시오.

let square x = x * x

소비 중인 파일, Script2.fsx:

#load "Script1.fsx"
open Script1

printfn $"%d{square 12}"

다음과 같이 Script2.fsx 평가할 수 있습니다.

dotnet fsi Script2.fsx
144

스크립트에서 원하는 만큼 #load 지시문을 지정할 수 있습니다.

메모

open Script1 선언이 필요합니다. 이는 F# 스크립트의 구문이 있는 스크립트 파일의 이름인 최상위 모듈로 컴파일되기 때문입니다. 스크립트 파일에 script3.fsx 같은 소문자가 있는 경우 암시적 모듈 이름은 자동으로 대문자로 표시되며 open Script3사용해야 합니다. 로드 가능한 스크립트를 사용하여 모듈의 특정 네임스페이스에 구문을 정의하려는 경우 모듈 선언의 네임스페이스를 포함할 수 있습니다. 예를 들면 다음과 같습니다.

module MyScriptLibrary

F# 코드에서 fsi 개체 사용

F# 스크립트는 F# 대화형 세션을 나타내는 사용자 지정 fsi 개체에 액세스할 수 있습니다. 출력 서식과 같은 항목을 사용자 지정할 수 있습니다. 명령줄 인수에 액세스할 수도 있습니다.

다음 예제에서는 명령줄 인수를 가져와서 사용하는 방법을 보여줍니다.

let args = fsi.CommandLineArgs

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

평가되면 모든 인수를 출력합니다. 첫 번째 인수는 항상 평가되는 스크립트의 이름입니다.

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

System.Environment.GetCommandLineArgs() 사용하여 동일한 인수에 액세스할 수도 있습니다.

F# 대화형 지시문 참조

앞에서 본 #r#load 지시문은 F# Interactive에서만 사용할 수 있습니다. F# Interactive에서만 사용할 수 있는 몇 가지 지시문이 있습니다.

지시문 묘사
#r "nuget:..." NuGet에서 패키지를 참조합니다.
#r "extname:..." extname 확장[^1](예: paket)에서 패키지 참조
#r "assembly-name.dll" 디스크의 어셈블리를 참조합니다.
#load "file-name.fsx" 소스 파일을 읽고 컴파일한 다음 실행합니다.
#help 특정 함수에 대해 사용 가능한 지시문 또는 설명서에 대한 정보를 표시합니다.
#I 어셈블리 검색 경로를 따옴표로 지정합니다.
#quit F# 대화형 세션을 종료합니다.
#time on 또는 #time off 단독으로, #time는 성능 정보를 표시할지 여부를 전환합니다. on일 때, F# 인터랙티브는 해석되고 실행되는 코드의 각 섹션에 대해 실시간, CPU 시간 및 가비지 수집 정보를 측정합니다.

[^1]: F# 대화형 확장대해 자세히 알아봅니다.

F# Interactive에서 파일 또는 경로를 지정하면 문자열 리터럴이 필요합니다. 따라서 파일 및 경로는 따옴표로 묶어야 하며 일반적인 이스케이프 문자가 적용됩니다. @ 문자를 사용하면 F# Interactive에서 경로가 포함된 문자열을 문자 그대로의 문자열로 해석할 수 있습니다. 이렇게 하면 F# Interactive에서 이스케이프 문자를 무시합니다.

다른 경우에는 F# 9부터 따옴표가 선택 사항입니다.

확장된 #help 지시문

이제 #help 지시문은 특정 함수에 대한 설명서 표시를 지원합니다. 함수의 이름을 직접 전달하여 세부 정보를 검색할 수 있습니다.

#help List.map;;

출력은 다음과 같습니다.

Description:
Builds a new collection whose elements are the results of applying the given function
to each of the elements of the collection.

Parameters:
- mapping: The function to transform elements from the input list.
- list: The input list.

Returns:
The list of transformed elements.

Examples:
let inputs = [ "a"; "bbb"; "cc" ]

inputs |> List.map (fun x -> x.Length)
// Evaluates to [ 1; 3; 2 ]

Full name: Microsoft.FSharp.Collections.ListModule.map
Assembly: FSharp.Core.dll

이러한 향상된 기능을 통해 F# 라이브러리를 대화형으로 보다 쉽게 탐색하고 이해할 수 있습니다.

자세한 내용은 공식 devblog참조하세요.

대화형 및 컴파일된 전처리기 지시문

F# Interactive에서 코드를 컴파일할 때 대화형으로 실행하든 스크립트를 실행하든 관계없이 INTERACTIVE 기호가 정의됩니다. 컴파일러에서 코드를 컴파일할 때 컴파일된 기호가 정의됩니다. 따라서 컴파일된 모드와 대화형 모드에서 코드가 달라야 하는 경우 조건부 컴파일에 이러한 전처리기 지시문을 사용하여 사용할 코드를 결정할 수 있습니다. 예를 들어:

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

Visual Studio에서 F# Interactive 사용

Visual Studio를 통해 F# Interactive를 실행하려면 F# 대화형레이블이 지정된 적절한 도구 모음 단추를 클릭하거나 Ctrl+Alt+F키를 사용할 수 있습니다. 이렇게 하면 F# 대화형 세션을 실행하는 도구 창인 대화형 창이 열립니다. 대화형 창에서 실행하려는 코드를 선택하고 Alt+Enter키 조합을 누를 수도 있습니다. F# 대화형은 F# 대화형레이블이 도구 창에서 시작됩니다. 이 키 조합을 사용하는 경우 편집기 창에 포커스가 있는지 확인합니다.

콘솔을 사용하든 Visual Studio를 사용하든 명령 프롬프트가 나타나고 인터프리터가 입력을 기다립니다. 코드 파일에서와 마찬가지로 코드를 입력할 수 있습니다. 코드를 컴파일하고 실행하려면 두 개의 세미콜론(;;)을 입력하여 한 줄 또는 여러 줄의 입력을 종료합니다.

F# Interactive는 코드를 컴파일하려고 시도하고, 성공하면 코드를 실행하고 컴파일한 형식 및 값의 서명을 출력합니다. 오류가 발생하면 인터프리터가 오류 메시지를 출력합니다.

동일한 세션에 입력된 코드는 이전에 입력한 모든 구문에 액세스할 수 있으므로 프로그램을 빌드할 수 있습니다. 도구 창의 광범위한 버퍼를 사용하면 필요한 경우 파일에 코드를 복사할 수 있습니다.

Visual Studio에서 실행하는 경우 F# Interactive는 프로젝트와 독립적으로 실행되므로 예를 들어 함수의 코드를 대화형 창에 복사하지 않는 한 F# Interactive에서 프로젝트에 정의된 구문을 사용할 수 없습니다.

설정을 조정하여 F# 대화형 명령줄 인수(옵션)를 제어할 수 있습니다. 도구 메뉴에서 옵션...을 선택하고 나서 F# 도구을 확장합니다. 변경할 수 있는 두 가지 설정은 F# 대화형 옵션과 64비트 F# 대화형 설정으로, 64비트 컴퓨터에서 F# Interactive를 실행하는 경우에만 관련이 있습니다. 이 설정은 컴퓨터 아키텍처를 사용하여 32비트 또는 64비트 프로세스로 실행할지 여부를 결정하는 전용 64비트 버전의 fsi.exe 또는 fsianycpu.exe실행할지 여부를 결정합니다.

타이틀 묘사
F# 대화형 옵션 F# Interactive, fsi.exe명령줄 구문 및 옵션에 대해 설명합니다.