Fastest JSON parser in the world is a D project

wobbles via Digitalmars-d-announce digitalmars-d-announce at puremagic.com
Wed Oct 28 04:26:57 PDT 2015


On Tuesday, 27 October 2015 at 14:00:07 UTC, Martin Nowak wrote:
> On Tuesday, 27 October 2015 at 13:14:36 UTC, wobbles wrote:
>>> How can `coordinates` member be known at compile-time when 
>>> the input argument is a run-time string?
>>
>> I suspect through the opDispatch operator overload.
>>
>> http://dlang.org/operatoroverloading.html#dispatch
>
> Yikes, this is such an anti-pattern.
> https://github.com/rejectedsoftware/vibe.d/issues/634

Heh - yeah it is quite problematic.

The only time I've needed to use it was when I was reading in 
Json with some structure like
{
   [
     {  "timestamp" : { ... timestamp info ... },
        "info1" : { ... info ...},
        "info2" : { ... info ...},
         .
         .
        "info 23" : { ... info  ...}
     },
     { < more of the above >}
   ]
}

and I wanted to be able get a Json[timestamp] map, where the Json 
is either a info1, info2 etc etc.
I didn't want to write 23 different functions "hash_info1", 
"hash_info2" etc etc.
So, opDispatch!

Basically I wanted to hash the timestamp and some data. My 
opDispatch became:

	@ignore auto opDispatch(string name)(){
		static assert(name.startsWith("hash_"), "Error, use 
StatHosts.hash_XYZ to gather XYZ[timestamp] info");
		static assert(name.length > 5);
		enum dataName = name[5..$];
		typeof(mixin("StatDetail."~dataName))[StatTimestampDetail] data;

		foreach(stat; statistics){
			data[stat.timestamp] = mixin("stat."~dataName);
		}
		return data;
	}

23 functions merged into 1...

The static assert reduces the number of places it can break 
things at least, still some weird things can happen but for the 
most part it's ok.

So yes - opDispatch is cool but should be used VERY sparingly.


More information about the Digitalmars-d-announce mailing list