2010-03-10 4 views
13

콘솔에서 printfn 기능과 마찬가지로 읽을 수있는 내장 기능이 있다면 누구에게 알 수 있습니까? 지금까지 본 유일한 방법은 System.Console.Read()을 사용하고 있지만 printfn과 같은 구조를 사용하는 것만 큼 기능적으로 느껴지지 않습니다.F에서 콘솔에서 읽기

답변

16

그런 내장 기능이 없다는 것은 참으로 수치스러운 일이다. 그러나 Brian이 Benjol의 대답에 대한 언급에서 언급했듯이 scanf 함수를 직접 빌드 할 수 있습니다. 단지 %s 자리가 구현되어 있지만, 여기에 하나가 sscanf 변형을 정의하는 방법의 빠른 스케치,이다 :

open System 
open System.Text 
open System.Text.RegularExpressions 
open Microsoft.FSharp.Reflection 

let sscanf (pf:PrintfFormat<_,_,_,_,'t>) s : 't = 
    let formatStr = pf.Value 
    let constants = formatStr.Split([|"%s"|], StringSplitOptions.None) 
    let regex = Regex("^" + String.Join("(.*?)", constants |> Array.map Regex.Escape) + "$") 
    let matches = 
    regex.Match(s).Groups 
    |> Seq.cast<Group> 
    |> Seq.skip 1 
    |> Seq.map (fun g -> g.Value |> box) 
    FSharpValue.MakeTuple(matches |> Seq.toArray, typeof<'t>) :?> 't 


let (a,b) = sscanf "(%s, %s)" "(A, B)" 
let (x,y,z) = sscanf "%s-%s-%s" "test-this-string" 
+7

더 완성이 필요할 때 버전의'sscanf'를 사용하면이 코드를 쉽게 확장 할 수 있습니다. 여기에 결과를보십시오 : http://fssnip.net/4I – wmeyer

+0

@wmeyer - 정말 끝내줍니다! – kvb

+0

@wmeyer : 이걸 FSharpx에 기부 하시겠습니까? https://github.com/fsharp/fsharpx –

1

아는 한, 아니오.

그것은 TryParse의 코드 골프 :

+3

가 그것은'printfn' 기능 자체는 컴파일러 마법에 의존하는 수치 - 당신은 당신의 자신의 F 번호'sscanf를을 만들 수 없습니다 '꽤 좋은. –

+4

당신은 그것을 할 수 있다고 생각합니다. 유일한 마술은 문자열 리터럴을 PrintfFormats로 강제 변환 할 수 있다는 것입니다. let pf() : PrintfFormat <_, _, _, _> = "% d % s" – Brian

관련 문제