F #

2010-03-10 9 views
13

में कंसोल से पढ़ें क्या किसी को भी पता है कि कंसोल से पढ़ने के लिए printfn फ़ंक्शन पर कोई अंतर्निहित फ़ंक्शन है या नहीं? अब तक देखा गया एकमात्र तरीका System.Console.Read() का उपयोग कर रहा है लेकिन यह printfn जैसे निर्माण का उपयोग करने के रूप में कार्यात्मक नहीं लगता है।F #

उत्तर

16

यह वास्तव में एक शर्म की बात है कि ऐसा कोई अंतर्निहित कार्य नहीं है। हालांकि, जैसा कि ब्रायन ने बेंगलोल के उत्तर पर एक टिप्पणी में उल्लेख किया था, scanf स्वयं को कार्य करना संभव है। यहाँ एक एक sscanf संस्करण कैसे परिभाषित कर सकता है की एक त्वरित स्केच, है, हालांकि केवल %s प्लेसहोल्डर कार्यान्वित कर रहे हैं:

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

जहाँ तक मुझे पता है, नहीं।() और विभाजन/regex तुम क्या "बॉक्स से बाहर" का उपयोग कर सकते है

यह कोड गोल्फ :) TryParse की

+3

यह एक शर्म की बात है 'printfn' समारोह ही संकलक जादू पर निर्भर करता है है - आप अपने खुद के एफ #' sscanf नहीं कर सके काफी अच्छा है। –

+4

आप ऐसा कर सकते हैं, मुझे लगता है। एकमात्र जादू यह है कि स्ट्रिंग अक्षर को PrintfFormats पर ले जाया जा सकता है, जिस बिंदु पर प्रकार प्रकट होते हैं: पीएफ(): printfFormat <_, _, _, _> = "% d% s" – Brian

संबंधित मुद्दे