Re: StringCvt.cs with regex matching
Thomas Logan <[email protected]> Tue, 18 Oct 2016 10:46:36 -0400
| Newsgroups | gmane.comp.lang.ml.mlton.user |
|---|---|
| Message-ID | <CAHQ_4ZHD2-Vrq=z1cJfCx4do9SwRSG4dmgak=Vs7t6qceW+AJw@mail.gmail.com> |
Great. Thanks for such a detailed response. On Tue, Oct 18, 2016 at 9:19 AM, Matthew Fluet <[email protected]> wrote: > On Sun, Oct 16, 2016 at 6:54 PM, Thomas Logan <[email protected]> > wrote: > > I'm using StringCvt.scanString for regex matching, which requires a > > StringCvt.cs, and thus the match_tree is required to use StringCvt.cs. > The > > type checker won't allow using StringCvt.cs as an int. Is there a way to > > convert it to an int? > > > > Error: ... > > Case object and rules disagree. > > object type: (_ * {pos: [StringCvt.cs], ...} MatchTree.match_tree) > option > > rules expect: (_ * {pos: [int], ...} MatchTree.match_tree) option > > It looks like you are using the SML/NJ RegExp library: > http://www.smlnj.org/doc/smlnj-lib/Manual/regexp-lib-part.html#section:0 > > The Basis Library specification states that the StringCvt.cs type is > opaque, so there isn't a conversion from StringCvt.cs to int (in MLton; > SML/NJ seems to expose the implementation of StringCvt.cs as int). > > You can write your own "scanString" function that reveals the state type > as int: > > > structure RE = RegExpFn(structure P = AwkSyntax > structure E = BackTrackEngine) > structure MatchTree = > struct > open MatchTree > fun toString s (Match (x, mts)) : string = > concat ["Match (", s x, ", ", > "[", String.concatWith "," (List.map (toString s) mts), "]", > ")"] > end > > fun scanString f s = > let > fun strRdr i = > if i >= String.size s > then NONE > else SOME (String.sub (s, i), i + 1) > in > case f strRdr 0 of > NONE => NONE > | SOME (x, _) => SOME x > end > > val re = RE.compileString "l(mn)o" > val s = "abcdefghijklmnopqrstuvwxyz" > > val _ = > case scanString (RE.find re) s of > NONE => print "no match\n" > | SOME mt => print (concat ["Match: ", > MatchTree.toString > (fn {len, pos} => concat ["{len = ", > Int.toString len, > ",pos = ", > Int.toString pos, "}"]) > mt, > "\n"]) > > [mtf@uller tmp]$ mlton z.mlb > > [mtf@uller tmp]$ ./z > > Match: Match ({len = 4,pos = 11}, [Match ({len = 2,pos = 12}, [])]) > > -- > You received this message because you are subscribed to the Google Groups > "MLton-user" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > > ------------------------------------------------------------ > ------------------ > Check out the vibrant tech community on one of the world's most > engaging tech sites, SlashDot.org! http://sdm.link/slashdot > _______________________________________________ > MLton-user mailing list > [email protected]; [email protected] > https://lists.sourceforge.net/lists/listinfo/mlton-user > > -- You received this message because you are subscribed to the Google Groups "MLton-user" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, SlashDot.org! http://sdm.link/slashdot _______________________________________________ MLton-user mailing list [email protected]; [email protected] https://lists.sourceforge.net/lists/listinfo/mlton-user