DMD Issue with Asm Generation?
There seems to be some invalid code generation for std.format for type of "real". Relavant links: https://github.com/D-Programming-Language/phobos/blob/master/std/format.d#L1713 https://github.com/D-Programming-Language/phobos/blob/master/std/math.d#L5118 movabs rbx,7FF0| <-- problem, should be 0x7FFF and rax,rbx| cmp rax,rbx| jne test.7FF6FF4762E4 | mov rdx,qword ptr ss:[rbp-230] | movabs rcx,F | test rdx,rcx | je test.7FF6FF4762E4 | lea rax,qword ptr ds:[7FF6FF4C5C02]| ;7FF6FF4C5C02:"nan" mov qword ptr ss:[rbp-2C8],rax | mov qword ptr ss:[rbp-2D0],3 | jmp test.7FF6FF476335 | mov rsi,qword ptr ss:[rbp-230] | movabs rax,7FFF| and rsi,rax| cmp rsi,rbx| jne test.7FF6FF476335 | fld tword ptr ss:[rbp-228] | fldz | fcompi st1 | fstp st0 | ja test.7FF6FF47631B | jp test.7FF6FF47631B | lea rdx,qword ptr ds:[7FF6FF4C5C06]| ;7FF6FF4C5C06:"inf" mov ebx,3 | jmp test.7FF6FF476327 | ;format.d:1495 lea rdx,qword ptr ds:[7FF6FF4C5C0A]| ;7FF6FF4C5C0A:"-inf" Seems to compile fine with DMD at least with simpler code with just an if statement. Also this issue doesn't exist for 32-bit x86.
Re: DMD Issue with Asm Generation?
Disregard all that above, looks like someone used a "double" which uses 0x7FF0 to check if infinite. Not sure why the code runs fine on x86 though, different library maybe? https://github.com/D-Programming-Language/phobos/blob/master/std/format.d#L1709
Uniform Function Call Syntax?
Was just wondering why UFCS only works in one direction, that is why functions can be used as if it were part of a struct/class but not the other way around. struct Vec3 { float x; float y; float z; float dot(Vec3 o) { return x * o.x + y * o.y + z * o.z; } } int dot; Vec3 a, b; float value = dot(a, b); // would be same as a.dot(b) // doesn't try to use local "int dot" It may not add as much value but I think it'd be a bit better as now you no longer have a global function with a simple name "dot". For mathematical purposes it is a lot easier to understand "dot(a, b)" than "a.dot(b)", at least in my opinion. Just curious that's all.
Re: Uniform Function Call Syntax?
On Friday, 4 March 2016 at 02:09:25 UTC, Era Scarecrow wrote: On Friday, 4 March 2016 at 01:56:34 UTC, user001 wrote: Was just wondering why UFCS only works in one direction, that is why functions can be used as if it were part of a struct/class but not the other way around. int dot; float value = dot(a, b); // would be same as a.dot(b) // doesn't try to use local "int dot" Immediately looking at only that part of the code, i have to ask 'how the hell are you calling the int???'. Of course i can tell from your source dot is also a function in the vector. Considering dot could now shadow the variables or function names, it would quickly QUICKLY become annoying. A hierarchy of how the call is used plus the documentation of what it's obviously doing is a much better approach. Not to mention we've been using . and -> and * so long for accessing/de-referencing members that are attached so long that changing it is probably not an option. You can say the same thing about how it is currently implemented. int[] arr = [ 0, 1, 2, 3 ]; static map(alias F)(int[]) { } writeln(arr.map!(a => a * 2)); // what does this mean array doesnt have a map function, does it use the local map function or the global one? MAYBE if you were starting a language from scratch, but in this case i would firmly say no, this is ugly and confusing. Well it could possibly be happening with C++17 so it's not that big of stretch to add it to an existing language, especially if that language already has it half implemented.