[Haskell-cafe] Reflection.Emit in Haskell
Bulat Ziganshin
bulat.ziganshin at gmail.com
Thu Jan 17 17:39:02 EST 2008
Hello Cetin,
Friday, January 18, 2008, 12:52:27 AM, you wrote:
> As a .NET (C#/F#) programmer learning Haskell, I would love to know
> the best online sources about run-time compilation etc. like
hs-plugins (unix-only afair), and GHC-as-a-library
> Reflection.Emit in .NET. I am making heavy use of this .NET API to
> compile customized (regular-expressions-) FSAs at run-time and want
> to learn how I might achieve the same in Haskell. Book or online
> article references specific to this issue will be highly appreciated ^_^
it was Runtime_Compilation page on old Haskell wiki, written by Andrew
Bromage and me. in short, some form of run-time compilation works
without actual compiling code. in particular, RegEx package compiles
regexps on the fly. my own program includes very simple variant of
run-time compiled regexps:
-- Compiled regexp Example
data RegExpr = RE_End -- ""
| RE_Anything -- "*"
| RE_AnyStr RegExpr -- '*':"bc*"
| RE_FromEnd RegExpr -- '*':"bc"
| RE_AnyChar RegExpr -- '?':"bc"
| RE_Char Char RegExpr -- 'a':"bc"
-- |Compile string representation of regexpr into RegExpr
compile_RE s = case s of
"" -> RE_End
"*" -> RE_Anything
'*':cs | cs `contains` '*' -> RE_AnyStr (compile_RE cs)
| otherwise -> RE_FromEnd (compile_RE$ reverse s)
'?':cs -> RE_AnyChar (compile_RE cs)
c :cs -> RE_Char c (compile_RE cs)
-- |Check match of string s with regexpr re
match_RE re s = case re of
RE_End -> null s
RE_Anything -> True
RE_AnyStr r -> any (match_RE r) (tails s)
RE_FromEnd r -> match_RE r (reverse s)
RE_AnyChar r -> case s of
"" -> False
_:xs -> match_RE r xs
RE_Char c r -> case s of
"" -> False
x:xs -> x==c && match_RE r xs
-- |Check match of string s with regexpr re, represented as string
match re {-s-} = match_RE (compile_RE re) {-s-}
actually, you will not find anything unusual here. the code for
matching with RegExpr is just constructed at runtime (as tree of
closures) which makes matching quite efficient
--
Best regards,
Bulat mailto:Bulat.Ziganshin at gmail.com
More information about the Haskell-Cafe
mailing list