digitalmars.D.learn - "extern" template instantiation
- Mathias LANG (41/41) Oct 22 2013 Hi everyone,
- Dicebot (9/9) Oct 23 2013 Using `enum` with ctRegex is discouraged because it is a dumb
- Mathias LANG (13/22) Oct 24 2013 Using auto was my first try. Unfortunately it has the same issue
- Dmitry Olshansky (12/37) Oct 24 2013 Something to the extent of
Hi everyone, This is going to be a silly question. I have the following files: -- heavy.d -- import std.regex; enum r = ctRegex!(r"^(\w+)\s+([a-zA-Z0-9/]+)\?a=(\w+)&b=(\w+)&c=(\w+)([&\D+=\w+)]*)&y=([0-9A-Fa-z]+)&z=([0-9A-Fa-z]+)$"); -- main.d -- import heavy; void main() {} -- test.d -- import heavy; void test() {} So I had a Makefile, and hit compile. *BAM* 1m40s latter, I switched from GDC to DMD, and updated my dmd to bleeding edge. I though it might help because of: http://d.puremagic.com/issues/show_bug.cgi?id=11284 $ dmd DMD64 D Compiler v2.064-devel-b12d171 But it didn't (time make): dmd -debug -c main.d -ofobjs/debug//main.o dmd -debug -c heavy.d -ofobjs/debug//heavy.o dmd -debug -c test.d -ofobjs/debug//test.o - Linking bfake real 0m19.893s user 0m11.092s sys 0m2.416s With the import commented out (and make clean'ed): dmd -debug -c main.d -ofobjs/debug//main.o dmd -debug -c heavy.d -ofobjs/debug//heavy.o dmd -debug -c test.d -ofobjs/debug//test.o - Linking bfake real 0m5.636s user 0m4.124s sys 0m0.872s So I thought of: public alias typeof(ctRegex!(my-super-long-string)) APIRegex; in a .di file, but I get a linker error, and it stills need to instantiate the template anyway. Can anyone point me to the right way to do this ? Thanks!
Oct 22 2013
Using `enum` with ctRegex is discouraged because it is a dumb copy-paste upon every enum usage. I'd recommend to use global variable initialized during compile-time: ``` auto r = ctRegex!(r"^(\w+)\s+([a-zA-Z0-9/]+)\?a=(\w+)&b=(\w+)&c=(\w+)([&\D+=\w+)]*)&y=([0-9A-Fa-z]+)&z=([0-9A-Fa-z]+)$"); ``` Though it is pretty complex ctRegex and compiling it is a good stress test for any compiler :)
Oct 23 2013
On Wednesday, 23 October 2013 at 11:58:17 UTC, Dicebot wrote:Using `enum` with ctRegex is discouraged because it is a dumb copy-paste upon every enum usage. I'd recommend to use global variable initialized during compile-time: ``` auto r = ctRegex!(r"^(\w+)\s+([a-zA-Z0-9/]+)\?a=(\w+)&b=(\w+)&c=(\w+)([&\D+=\w+)]*)&y=([0-9A-Fa-z]+)&z=([0-9A-Fa-z]+)$"); ``` Though it is pretty complex ctRegex and compiling it is a good stress test for any compiler :)Using auto was my first try. Unfortunately it has the same issue (slighly faster, but still "dumb C/P". So far I didn't find any way to tell the compiler not to compile it if I'm not using it (aside from versions). As the type itself takes ages to compile, any reasonable-sized project with few regexes will not be able to use ctRegex in dev mode. I suppose there's no way to create a function that returns a generic ctRegex object without loosing the advantages ? Note: The regex might seems complex, but actually isn't. It parses an home-made REST API based on query authentification: http://broadcast.oreilly.com/2009/12/principles-for-standardized-rest authentication.html . To me it sounded like a simple use case.
Oct 24 2013
24-Oct-2013 20:30, Mathias LANG пишет:On Wednesday, 23 October 2013 at 11:58:17 UTC, Dicebot wrote:Something to the extent of auto getMeARegex() { static r = ctRegex!(r"^(\w+)\s+([a-zA-Z0-9/]+)\?a=(\w+)&b=(\w+)&c=(\w+)([&\D+=\w+)]*)&y=([0-9A-Fa-z]+)& =([0-9A-Fa-z]+)$"); return r; } _Might_ work. Failing that make it an 0-arg template: auto getMeARegex()(){ ... }Using `enum` with ctRegex is discouraged because it is a dumb copy-paste upon every enum usage. I'd recommend to use global variable initialized during compile-time: ``` auto r = ctRegex!(r"^(\w+)\s+([a-zA-Z0-9/]+)\?a=(\w+)&b=(\w+)&c=(\w+)([&\D+=\w+)]*)&y=([0-9A-Fa-z]+)&z=([0-9A-Fa-z]+)$"); ``` Though it is pretty complex ctRegex and compiling it is a good stress test for any compiler :)Using auto was my first try. Unfortunately it has the same issue (slighly faster, but still "dumb C/P". So far I didn't find any way to tell the compiler not to compile it if I'm not using it (aside from versions). As the type itself takes ages to compile, any reasonable-sized project with few regexes will not be able to use ctRegex in dev mode. I suppose there's no way to create a function that returns a generic ctRegex object without loosing the advantages ?Note: The regex might seems complex, but actually isn't. It parses an home-made REST API based on query authentification: http://broadcast.oreilly.com/2009/12/principles-for-standardized-rest-authentication.html . To me it sounded like a simple use case.-- Dmitry Olshansky
Oct 24 2013