On Tue, Feb 06, 2018 at 05:35:44AM +0000, Dmitry Olshansky via Digitalmars-d 
wrote:
> On Tuesday, 6 February 2018 at 04:35:42 UTC, Steven Schveighoffer wrote:
> > On 2/5/18 11:09 PM, psychoticRabbit wrote:
[...]
> > > ----
> > > import std.net.isemail;
> > > 
> > > void main()
> > > {
> > >      auto checkEmail = "some...@somewhere.com".isEmail();
> > > }
> > > ----
> > 
> > I was surprised at this, then I looked at the first line of isEmail:
> > 
> >     static ipRegex =
> > ctRegex!(`\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}`~
> > 
> > `(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$`.to!(const(Char)[]));
> > 
> > So it's really still related to regex.

Yeah, ctRegex is a bear at compile-time.  Why can't we just use a
runtime regex?  It will at least take "only" 3 seconds to compile. :-D
Or just don't use a regex at all.


> That’s really bad idea - isEmail is template so the burden of freaking
> slow ctRegex is paid on per instantiation basis. Could be horrible
> with separate compilation.
[...]

I'm not sure I'm seeing the value of using ctRegex here.  What's wrong
with a module static runtime regex initialized by a static this()?

And before anyone complains about initializing the regex if user code
never actually uses it, it's possible to use static this() on an
as-needed basis:

        template ipRegex()
        {
                // Eponymous templates FTW!
                Regex!char ipRegex;

                static this()
                {
                        ipRegex = regex(`blah blah blah`);
                }
        }

        auto isEmail(... blah blah ...)
        {
                ...
                if (ipRegex.match(...)) ...
                ...
        }

Basically, if `ipRegex` is never referenced, the template is never
instantiated and the static this() basically doesn't exist. :-D
Pay-as-you-go FTW!


T

-- 
If you want to solve a problem, you need to address its root cause, not just 
its symptoms. Otherwise it's like treating cancer with Tylenol...

Reply via email to