Re: how to detect ctfe

2014-06-01 Thread Philpax via Digitalmars-d-learn

__ctfe can be used for this purpose:

The __ctfe boolean pseudo-variable, which evaluates to true at 
compile time, but false at run time, can be used to provide an 
alternative execution path to avoid operations which are 
forbidden at compile time. Every usage of __ctfe is evaluated 
before code generation and therefore has no run-time cost, even 
if no optimizer is used. ( http://dlang.org/function.html )


Re: how to detect ctfe

2014-06-01 Thread bearophile via Digitalmars-d-learn

Vlad Levenfeld:

Is there any way that I can detect whether or not a function is 
being evaluated at compile time? Specifically I want to switch 
between to use/not to use memoize!func without having to figure 
out when its CTFE-able and calling it with different syntax.


Calling it with a different syntax seems not easy to do. But 
there is a run-time variable __ctfe that can be used to 
disable/enable the memoization.


Bye,
bearophile


Re: enums

2014-06-01 Thread Philippe Sigaud via Digitalmars-d-learn
On Sat, May 31, 2014 at 10:14 PM, bearophile via Digitalmars-d-learn
digitalmars-d-learn@puremagic.com wrote:

 In contrast to those two examples where immutable can be used at compile
 time, what are some other cases where it is necessary to use enum instead
 of immutable?


 By default use enum if you define a compile-time-known value (...)

Now that we have immutable's that can be used inside templates, why
use an enum? Because it's 'inlined' in the code?

(I know the reason not to use it for an array or associative array, I
experimented that fully in my own code. Ouch!)


Re: how to detect ctfe

2014-06-01 Thread Philippe Sigaud via Digitalmars-d-learn
But let's keep in mind it's a *runtime* value. You cannot use it at
compile-time as a boolean for a 'static if'.
So:

if (__ctfe) // yes
{
// compile-time path
}
else
{
// runtime path
}

But not:

static if (__ctfe) // no
{
// compile-time path, including new global declarations
}
else
{
// runtime path
}

Why would you want to do that? I needed an associative array for my
code. AA don't work that well at compile-time. So I wanted to replace
them with my own Associative struct, maybe less efficient/generic, but
that works at CT. The idea was:

static if (__ctfe)
alias Type = Associative!(string, string);
else
alias Type = string[string];

// then, use Type, whatever the path.


Re: Casting Structs

2014-06-01 Thread Philippe Sigaud via Digitalmars-d-learn
On Sun, Jun 1, 2014 at 12:34 AM, Timon Gehr via Digitalmars-d-learn
digitalmars-d-learn@puremagic.com wrote:

 This behaviour is independent of templates. Struct values of the same size
 can be reinterpret-cast to each other this way even if their types are
 completely unrelated.

Do you know if this is by design?


Re: enums

2014-06-01 Thread Chris Nicholson-Sauls via Digitalmars-d-learn

On Saturday, 31 May 2014 at 22:45:32 UTC, bearophile wrote:

Chris Nicholson-Sauls:


Good... I was starting to fear I was the only one.


In general you can't fix the names in a language because you 
always find someone that likes the ones present :) I think 
enum is a bad name for the purpose of defining manifest 
constants, but I don't think this will change.


Bye,
bearophile


In a perfect world, sure, we'd have a different name for it; I'm 
not saying I love it, just that it makes sense in my head.  
I've sometimes thought 'alias' could have worked as well, 
especially now with the a=b syntax.


alias DEFAULT_PORT = 11020;

But, then we exchange one set of brow raisers for another set.  
In the absence of #define, there probably is no achievable ideal. 
 :)


Interfacing to const T or const T* C++ code

2014-06-01 Thread Atila Neves via Digitalmars-d-learn

So I was mucking about with calling C++ from D yesterday and was
pleasantly surprised that this worked:

D:
 struct Foo { int i; int j; }
 extern(C++) void useFoo(ref const(Foo) foo);

C++:
 struct Foo { int i; int j; };
 void useFoo(const Foo foo) { ... }

In fact, omitting const on either side causes a link error, and
the same for using a pointer instead of a reference on one of the
sides. All good. But this doesn't work:

D:
 extern(C++) interface DClass { int getIndex() const; }
 extern(C++) void useObj(in DClass dclass); //I also tried
const(DClass)

C++:

 struct DClass { virtual int getIndex() const = 0; }
 void useObj(const DClass* dclass); //DClass* works though!

I can make `DClass` `const` or `in` in D as much as I want, but
it fails to link if I add const on the C++ side. Is there a
reason why it works for structs (as it should) but not classes?
It'd be nice to be able to pass classes in by const T. Or even
const T*!

Atila


Re: Interfacing to const T or const T* C++ code

2014-06-01 Thread bearophile via Digitalmars-d-learn

Atila Neves:


D:
 struct Foo { int i; int j; }
 extern(C++) void useFoo(ref const(Foo) foo);

C++:
 struct Foo { int i; int j; };
 void useFoo(const Foo foo) { ... }


This doesn't look very safe because D const is transitive, unlike 
the C++ const. So in the C++ code you can mutate inner data 
inside foo and the D code will assume such data is not changed.


Bye,
bearophile


text() vs. format() for formatting assert/exception messages

2014-06-01 Thread Joseph Rushton Wakeling via Digitalmars-d-learn

Hello all,

What's the current state of preference (if any) for using std.conv.text vs. 
std.string.format (or others?) when formatting error messages for 
assert/enforce/exceptions?


I seem to recall a deprecation message pushing the use of std.string.format at 
some point in the past, but text() now seems to pass without comment.


Thanks  best wishes,

-- Joe


Re: Different random shuffles generated when compiled with gdc than with dmd

2014-06-01 Thread Ivan Kazmenko via Digitalmars-d-learn
On Saturday, 31 May 2014 at 21:22:48 UTC, Joseph Rushton Wakeling 
via Digitalmars-d-learn wrote:
On 31/05/14 22:37, Joseph Rushton Wakeling via 
Digitalmars-d-learn wrote:

On 30/05/14 22:45, monarch_dodra via Digitalmars-d-learn wrote:
Didn't you make changes to how and when the global PRNG is 
popped and accessed

in randomShuffle? I figured it *could* be an explanation.


I think it's more likely that the culprit is either your set 
of patches to the
Mersenne Twister, or the patches made to uniform() (which is 
called by

partialShuffle).  I'll look more deeply into this.


It's due to the the updated uniform() provided in this pull 
request:

https://github.com/D-Programming-Language/phobos/commit/fc48d56284f19bf171780554b63b4ae83808b894


I second the thought that reproducibility across different 
versions is an important feature of any random generation 
library.  Sadly, I didn't use a language yet which supported such 
a flavor of reproducibility for a significant period of time in 
its default random library, so I have to use my own randomness 
routines when it matters.  I've reported my concern [1] at the 
moment of breakage, but apparently it didn't convince people.  
Perhaps I should make a more significant effort next time (like a 
pull request) for the things that matter to me.  Well, now I know 
it does matter for others, at least.


In short, if uniform() has to be tweaked, the sooner it happens, 
the better.


Alternatively, the library design could allow different uniform() 
implementations to be plugged in, and provide legacy 
implementations along with the current (default) one.  In that 
case, all one has to do to reproduce the old behavior is to plug 
the appropriate one in.


[1] 
http://forum.dlang.org/thread/vgmdoyyqhcqurpmob...@forum.dlang.org#post-gjuprkxzmcbdixtbucea:40forum.dlang.org


floating point conversion

2014-06-01 Thread Martin Krejcirik via Digitalmars-d-learn
import std.conv;

void main()
{
float a = 1.23f;
double b = to!float(1.23);
assert (a == b); // ???
}

Should the assert fail or not ? (Please reply without trying first).


If your reply is yes, should
assert (a == to!float(1.23))
fail or not ?

I'm bringing this up, because dmd and gdc (x86) don't agree on this.

-- 
mk


Re: Casting Structs

2014-06-01 Thread Timon Gehr via Digitalmars-d-learn

On 06/01/2014 09:59 AM, Philippe Sigaud via Digitalmars-d-learn wrote:

On Sun, Jun 1, 2014 at 12:34 AM, Timon Gehr via Digitalmars-d-learn
digitalmars-d-learn@puremagic.com wrote:


This behaviour is independent of templates. Struct values of the same size
can be reinterpret-cast to each other this way even if their types are
completely unrelated.


Do you know if this is by design?



Well, it had to be explicitly implemented. The behaviour contradicts the 
documentation at http://dlang.org/expression#CastExpression though.


Re: floating point conversion

2014-06-01 Thread bearophile via Digitalmars-d-learn

Martin Krejcirik:


float a = 1.23f;
double b = to!float(1.23);
assert (a == b); // ???
}

Should the assert fail or not ? (Please reply without trying 
first).


It's a bad question. Generally to compare floating point values 
for equality use std.math.feqrel.


Bye,
bearophile


Re: floating point conversion

2014-06-01 Thread Martin Krejcirik via Digitalmars-d-learn
On 1.6.2014 14:45, bearophile wrote:
 It's a bad question. Generally to compare floating point values for
 equality use std.math.feqrel.

So it's just a coincidence, that GDC, LDC x86 and also DMD x86_64
doesn't fail ?

And this bug https://issues.dlang.org/show_bug.cgi?id=12831
should be marked invalid ?

-- 
mk


Re: floating point conversion

2014-06-01 Thread Qox via Digitalmars-d-learn
So it's just a coincidence, that GDC, LDC x86 and also DMD 
x86_64

doesn't fail ?


(Equality) Compareision of float/float or float/double are 
machine dependent (depends even on x86 on the generated code 
(SSE/SSE2/AVX/AVX2), rounding settings, maybe event the cpu 
vendor etc.).

On other platforms (ARM, etc) it could be even more weird.

The General rule is not to compare floats for equality, (is 
0.0==-0.0, etc.). Use a epsilon based comparision scheme instead 
or a wrapper around it.


Re: Different random shuffles generated when compiled with gdc than with dmd

2014-06-01 Thread Andrew Brown via Digitalmars-d-learn
Thank you for hunting down the difference, in my case it's not a 
deal breaking problem. I can just specify the compiler and 
language version, then the results become reproducible. And I'm 
sure I'll appreciate the performance boost!


On Sunday, 1 June 2014 at 12:11:22 UTC, Ivan Kazmenko wrote:
On Saturday, 31 May 2014 at 21:22:48 UTC, Joseph Rushton 
Wakeling via Digitalmars-d-learn wrote:
On 31/05/14 22:37, Joseph Rushton Wakeling via 
Digitalmars-d-learn wrote:
On 30/05/14 22:45, monarch_dodra via Digitalmars-d-learn 
wrote:
Didn't you make changes to how and when the global PRNG is 
popped and accessed

in randomShuffle? I figured it *could* be an explanation.


I think it's more likely that the culprit is either your set 
of patches to the
Mersenne Twister, or the patches made to uniform() (which is 
called by

partialShuffle).  I'll look more deeply into this.


It's due to the the updated uniform() provided in this pull 
request:

https://github.com/D-Programming-Language/phobos/commit/fc48d56284f19bf171780554b63b4ae83808b894


I second the thought that reproducibility across different 
versions is an important feature of any random generation 
library.  Sadly, I didn't use a language yet which supported 
such a flavor of reproducibility for a significant period of 
time in its default random library, so I have to use my own 
randomness routines when it matters.  I've reported my concern 
[1] at the moment of breakage, but apparently it didn't 
convince people.  Perhaps I should make a more significant 
effort next time (like a pull request) for the things that 
matter to me.  Well, now I know it does matter for others, at 
least.


In short, if uniform() has to be tweaked, the sooner it 
happens, the better.


Alternatively, the library design could allow different 
uniform() implementations to be plugged in, and provide legacy 
implementations along with the current (default) one.  In that 
case, all one has to do to reproduce the old behavior is to 
plug the appropriate one in.


[1] 
http://forum.dlang.org/thread/vgmdoyyqhcqurpmob...@forum.dlang.org#post-gjuprkxzmcbdixtbucea:40forum.dlang.org




How to convert int type to string int ?

2014-06-01 Thread bioinfornatics via Digitalmars-d-learn

Hi,

All is in the title.
I need this to do a tupleof enhanced, that mean:
   - .tupleof need an instance me i want to do this on type
diretcly
   - .tupleof do not bind to member name i need this


for this i strat to this code:

import std.stdio;
import std.typecons;
import std.conv;

struct Coord
{
 int x;
 int y;
 int z;
}

template toTuple(T){
 static string maker(){
 string statement = alias Tuple!(;
 foreach(const memberName; __traits(allMembers, T)){
 statement ~=  to!string(typeof(__traits(getMember, T,
memberName)))  ~ ,\ ~ memberName ~ \,  ;
 }
 statement = statement[O..$-1] ~ ) t; ; // $-1 to remove
extra comma
 return statement;
 }
 enum toTuple = mixin( maker() );
}


but that fail on typeof(__traits(getMember, T, memberName) becase
that return a type and not a string.


Thaks for your help


Re: How to convert int type to string int ?

2014-06-01 Thread bioinfornatics via Digitalmars-d-learn

On Sunday, 1 June 2014 at 13:34:20 UTC, bioinfornatics wrote:

Hi,

All is in the title.
I need this to do a tupleof enhanced, that mean:
   - .tupleof need an instance me i want to do this on type
diretcly
   - .tupleof do not bind to member name i need this


for this i strat to this code:

import std.stdio;
import std.typecons;
import std.conv;

struct Coord
{
 int x;
 int y;
 int z;
}

template toTuple(T){
 static string maker(){
 string statement = alias Tuple!(;
 foreach(const memberName; __traits(allMembers, T)){
 statement ~=  to!string(typeof(__traits(getMember, 
T,

memberName)))  ~ ,\ ~ memberName ~ \,  ;
 }
 statement = statement[O..$-1] ~ ) t; ; // $-1 to 
remove

extra comma
 return statement;
 }
 enum toTuple = mixin( maker() );
}


but that fail on typeof(__traits(getMember, T, memberName) 
becase

that return a type and not a string.


Thaks for your help


I find this: typeid(typeof(__traits(getMember, T,
memberName))).toString
but that do not works at compile time.

Error: static variable typeid(int) cannot be read at compile time


Re: How to convert int type to string int ?

2014-06-01 Thread Tobias Pankrath via Digitalmars-d-learn

Maybe http://dlang.org/property.html#stringof helps.


Re: How to convert int type to string int ?

2014-06-01 Thread bioinfornatics via Digitalmars-d-learn

On Sunday, 1 June 2014 at 13:52:27 UTC, Tobias Pankrath wrote:

Maybe http://dlang.org/property.html#stringof helps.


yes that help a lot thanks


Re: How to convert int type to string int ?

2014-06-01 Thread bioinfornatics via Digitalmars-d-learn

I bam close to be done

import std.stdio;
import std.typecons;
import std.conv;

struct Coord
{
 int x;
 int y;
 int z;
}

template toTuple(T){
 static string maker(){
 string statement = alias Tuple!(;
 foreach(const memberName; __traits(allMembers, T)){
 statement ~=  typeof(__traits(getMember, T,
memberName)).stringof  ~ ,\ ~ memberName ~ \,  ;
 }
 statement = statement[0..$-2] ~ ) toTuple; ; // $-1 to
remove extra comma
 return statement;
 }
 pragma( msg, maker() );
 mixin( maker() );
}

void main()
{
 //auto a = c.tupleof;
 auto a = toTuple!Coord;
}



$ ldc2 -w -oftestTupleof testTupleof.d
alias Tuple!(int,x, int,y, int,z) toTuple;
testTupleof.d(29): Error: type Tuple!(int, x, int, y, int,
z) has no value


Re: How to convert int type to string int ?

2014-06-01 Thread bioinfornatics via Digitalmars-d-learn

On Sunday, 1 June 2014 at 13:58:03 UTC, bioinfornatics wrote:

On Sunday, 1 June 2014 at 13:52:27 UTC, Tobias Pankrath wrote:

Maybe http://dlang.org/property.html#stringof helps.


yes that help a lot thanks


End of spam ( joke ^^)


I found it :-)

import std.stdio;
import std.typecons;
import std.conv;

struct Coord
{
 int x;
 int y;
 int z;
}

template toTuple(T){
 static string maker(){
 string statement = alias toTuple = Tuple!(;
 foreach(const memberName; __traits(allMembers, T)){
 statement ~=  typeof(__traits(getMember, T,
memberName)).stringof  ~ ,\ ~ memberName ~ \,  ;
 }
 statement = statement[0..$-2] ~ ) ; ; // $-1 to remove
extra comma
 return statement;
 }
 pragma( msg, maker() );
 mixin( maker() );
}


void main()
{
 Coord c;
 alias A = toTuple!Coord;
 A a;
 a[0] = 1;
 a.x = 1;
}


Re: Different random shuffles generated when compiled with gdc than with dmd

2014-06-01 Thread Joseph Rushton Wakeling via Digitalmars-d-learn

On 01/06/14 14:11, Ivan Kazmenko via Digitalmars-d-learn wrote:

I second the thought that reproducibility across different versions is an
important feature of any random generation library.  Sadly, I didn't use a
language yet which supported such a flavor of reproducibility for a significant
period of time in its default random library, so I have to use my own randomness
routines when it matters.  I've reported my concern [1] at the moment of
breakage, but apparently it didn't convince people. Perhaps I should make a more
significant effort next time (like a pull request) for the things that matter to
me.  Well, now I know it does matter for others, at least.


Yes, there probably should be a high bar for changes that break reproducibility 
in this way (although there certainly shouldn't be a ban: we shouldn't 
artificially constrain ourselves to avoid significant improvements to the module).


I missed the debate at the time, but actually, I'm slightly more concerned over 
the remark in that discussion that the new uniform was ported from 
java.util.Random.  Isn't OpenJDK GPL-licensed ... ?


Re: Is there any way to differentiate between a type and an alias?

2014-06-01 Thread Rene Zwanenburg via Digitalmars-d-learn
On Tuesday, 27 May 2014 at 18:05:24 UTC, Steven Schveighoffer 
wrote:
I get it. I don't necessarily agree with that, but it's not my 
library :)


I think it would be difficult to achieve without changing the 
actual function definition. Perhaps you could wrap the 
functions with your own, and use your own enum type. The enum 
as I defined it above, should implicitly cast to uint.


-Steve


Apologies for the late reply.

Manually wrapping seems a bit too heavy handed. On the other hand 
I have similar issues with the other Derelict libraries. For 
example, the GLFW_KEY_XXX enums. I'd much rather store 
stringified key bindings in a configuration file than raw key 
codes. With a bit of effort I should be able to build something 
that translates all these C like libraries to something more D 
like...


Re: floating point conversion

2014-06-01 Thread Famous via Digitalmars-d-learn

On Sunday, 1 June 2014 at 12:45:26 UTC, bearophile wrote:

It's a bad question.


Actually, Martin's question is a good one.

Initializing a variable of type float via a literal or as 
conversion from string should be the same, exacly, always. 
Casting a float to double should be deterministic as well.


Famous


Re: floating point conversion

2014-06-01 Thread Famous via Digitalmars-d-learn

float a = 1.234f;
float b = to!float(1.234);
assert (a == b);
assert (a == to!float(1.234)); // is allowed to fail due to 
constant folding




Re: floating point conversion

2014-06-01 Thread Martin Krejcirik via Digitalmars-d-learn
On 1.6.2014 16:42, Famous wrote:
 from string should be the same, exacly, always. Casting a float to
 double should be deterministic as well.

void main()
{
float a = 1.234f;
double b = 1.234;
assert (a == cast(float) b); // fails in DMD x86, works in GDC, LDC
}

Maybe enhancement request ?


-- 
mk


Re: floating point conversion

2014-06-01 Thread Famous via Digitalmars-d-learn

On Sunday, 1 June 2014 at 15:31:53 UTC, Martin Krejcirik wrote:

On 1.6.2014 16:42, Famous wrote:
from string should be the same, exacly, always. Casting a 
float to

double should be deterministic as well.


void main()
{
float a = 1.234f;
double b = 1.234;
assert (a == cast(float) b); // fails in DMD x86, works in 
GDC, LDC

}

Maybe enhancement request ?


This is different. The decimal 1.234 cannot be exacly represented 
as radix-2 floating-point number. In your example above, a and b 
are not equal. They are both approximations to 1.234 but the 
value of b is closer. Then casting b to float might or might not 
result in the same value as that of a. This is what bearophile 
and Qox referred to.


Since every float can be exacly converted to double the following 
situation is different:


float a = 1.234f;
double b = a;
assert(a == b);  // always succeeds in a sane environment

When taking into account constant folding, well, decide on your 
own, whether the following behaviour is sane:


void main()
{
  const float a = 1.234f;
  float b = 1.234f;

  assert(a == 1.234); // ok
  assert(b == 1.234); // fails
}


DMD fail when using both reflection and UDA

2014-06-01 Thread bioinfornatics via Digitalmars-d-learn

DMD (dmdfe 2.066) fail when i use UDA which store a delegate


code below works if i remove @section UDA otheswise it give this
error:

dmd: statement.c:714: ErrorStatement::ErrorStatement(): Assertion
`global.gaggedErrors || global.errors' failed.


is a bug  ?



--- CODE also on dpaste http://dpaste.dzfl.pl/3a3d660bd3bc

import std.stdio;
import std.typecons : Tuple;
import std.typetuple : Filter;


struct attribute{}

@attribute
struct section( alias start, alias end)
{
 alias checkStart = start;
 alias checkEnd = end;
}

template hasSection(T)
{
 static bool helper()
 {
 foreach(memberName; __traits(allMembers, T))
 {
 foreach(attr; __traits(getAttributes,
__traits(getMember, T, memberName)))
 {
 static if(is(attr == Section))
 return true;
 }
 }
 return false;
 }

 enum hasSection = helper();
}

struct Data{
 @section!( ( words ) =  words[0] == '@' , (
words ) =  words[0] == '\n' )
 string a;
 @section!( ( words ) =  words[0]  63  words[0] 115  , (
words ) =  words[0] == '\n' )
 string b;
 @section!( ( words ) =  words[0] == '+' , (
words ) =  words[0] == '\n' )
 string c;
}

template toTuple(T){
 static string maker(){
 string statement = alias toTuple = Tuple!(;
 foreach(const memberName; __traits(allMembers, T)){
 //~ mixin(`alias f = Filter!(hasSection,
__traits(getAttributes, T.` ~ memberName ~ `));`);
 statement ~=  typeof(__traits(getMember, T,
memberName)).stringof  ~ ,\ ~ memberName ~ \,  ;
 }
 statement = statement[0..$-2] ~ ) ; ; // $-2 to remove
extra comma
 return statement;
 }
 mixin( maker() );
}


void main()
{
 alias A = toTuple!Data;
 A a;
 a[0] = 1;
 a.x = 1;
}


Re: DMD fail when using both reflection and UDA

2014-06-01 Thread bioinfornatics via Digitalmars-d-learn

On Sunday, 1 June 2014 at 16:02:47 UTC, bioinfornatics wrote:

DMD (dmdfe 2.066) fail when i use UDA which store a delegate


code below works if i remove @section UDA otheswise it give this
error:

dmd: statement.c:714: ErrorStatement::ErrorStatement(): 
Assertion

`global.gaggedErrors || global.errors' failed.


is a bug  ?



--- CODE also on dpaste http://dpaste.dzfl.pl/3a3d660bd3bc

import std.stdio;
import std.typecons : Tuple;
import std.typetuple : Filter;


struct attribute{}

@attribute
struct section( alias start, alias end)
{
 alias checkStart = start;
 alias checkEnd = end;
}

template hasSection(T)
{
 static bool helper()
 {
 foreach(memberName; __traits(allMembers, T))
 {
 foreach(attr; __traits(getAttributes,
__traits(getMember, T, memberName)))
 {
 static if(is(attr == Section))
 return true;
 }
 }
 return false;
 }

 enum hasSection = helper();
}

struct Data{
 @section!( ( words ) =  words[0] == '@' , 
(

words ) =  words[0] == '\n' )
 string a;
 @section!( ( words ) =  words[0]  63  words[0] 115  , 
(

words ) =  words[0] == '\n' )
 string b;
 @section!( ( words ) =  words[0] == '+' , 
(

words ) =  words[0] == '\n' )
 string c;
}

template toTuple(T){
 static string maker(){
 string statement = alias toTuple = Tuple!(;
 foreach(const memberName; __traits(allMembers, T)){
 //~ mixin(`alias f = Filter!(hasSection,
__traits(getAttributes, T.` ~ memberName ~ `));`);
 statement ~=  typeof(__traits(getMember, T,
memberName)).stringof  ~ ,\ ~ memberName ~ \,  ;
 }
 statement = statement[0..$-2] ~ ) ; ; // $-2 to 
remove

extra comma
 return statement;
 }
 mixin( maker() );
}


void main()
{
 alias A = toTuple!Data;
 A a;
 a[0] = 1;
 a.x = 1;
}



ok it seem problem from my code a type string i need to
understand why


Re: DMD fail when using both reflection and UDA

2014-06-01 Thread bioinfornatics via Digitalmars-d-learn

stupid me bug was at the end

a[0] = 1;
  become
  a[0] = 1;

but error error was so stnange to me i though that was a bug


Re: DMD fail when using both reflection and UDA

2014-06-01 Thread Philippe Sigaud via Digitalmars-d-learn
In any case, it's an internal compiler error, so it's a bug. Users
should never see ICEs.
Could you please report it, with the entire error message?


Re: floating point conversion

2014-06-01 Thread Wanderer via Digitalmars-d-learn
The General rule is not to compare floats for equality, (is 
0.0==-0.0, etc.). Use a epsilon based comparision scheme 
instead or a wrapper around it.


That's not exactly true. You cannot (and should not) compare 
floating points for equality, and use epsilon-based comparison 
instead, only in one certain case: when one of the arguments if 
the result of computation, during which a computational error 
might accumulate.


If you have two exact or constant values, comparing them directly 
is perfectly fine. :-) Nowadays floating-point hardware support 
is not that buggy.


rawRead linker error

2014-06-01 Thread Joseph Rushton Wakeling via Digitalmars-d-learn

Hello all,

I'm trying to read from /dev/random using File.rawRead as follows:

auto f = File(/dev/urandom, r);
ulong b;
f.rawRead((b)[0 .. 1]);
writeln(b);

This generates a linker error:

rawread.o: In function `_D3std5stdio4File14__T7rawReadTmZ7rawReadMFAmZAm':
rawread.d:(.text._D3std5stdio4File14__T7rawReadTmZ7rawReadMFAmZAm+0xba): 
undefined reference to 
`_D3std9exception88__T12errnoEnforceTbVAyaa27_2f6f70742f646d642f696d706f72742f7374642f737464696f2e64Vmi715Z12errnoEnforceFNfbLAyaZb'

collect2: error: ld returned 1 exit status
--- errorlevel 1

Can anyone advise what's the problem here?  Passing a regular array as the 
buffer doesn't cause any issues, but I can't see what's wrong with passing a 
slice based around pointer-to-ulong as in the above example.


This certainly _used_ to work, so I take it it's down to a recent change to 
rawRead ... ?


Thanks and best wishes,

-- Joe


Re: rawRead linker error

2014-06-01 Thread Joseph Rushton Wakeling via Digitalmars-d-learn

On 01/06/14 19:04, Joseph Rushton Wakeling via Digitalmars-d-learn wrote:

Passing a regular array as the buffer doesn't cause any issues


In fact it seems to be a problem to pass any array other than a ubyte array; for 
example a ulong[] array is problematic.  The problem vanishes if the -inline 
option is not used.




Re: floating point conversion

2014-06-01 Thread Famous via Digitalmars-d-learn

I have compiled some cases at

 http://dpaste.dzfl.pl/5611b8bce8e3

This implies that floating-point constants do not have fixed but 
minimum precision. Particularly, the literal 1.23 describes a 
floating-point value with either double or real precision 
depending on what it is compared to.


This seems to comply with

 http://dlang.org/float.html








Test if member is static variable

2014-06-01 Thread Temtaime via Digitalmars-d-learn

Hi !
http://dpaste.dzfl.pl/e21082716396

Is there a way to optimize

static if(is(typeof(__traits(getMember, T, name).offsetof)) == 
false  is(FunctionTypeOf!(__traits(getMember, T, name)) == 
function) == false  __traits(compiles, __traits(getMember, T, 
name)))


?

I think there shoult be __traits(isStaticVariable), but there's 
not.


Thanks !


Re: floating point conversion

2014-06-01 Thread Martin Krejcirik via Digitalmars-d-learn
On 1.6.2014 18:02, Famous wrote:
 This is different. The decimal 1.234 cannot be exacly represented as
 radix-2 floating-point number. In your example above, a and b are not
 equal. They are both approximations to 1.234 but the value of b is

Still feels iffy to me. If you add:

   printf(%.70f\n%.70f\n, a, cast(float) b);

you can see that gcc in C and gdc in D both convert value of b to float
resulting in equality. Dmd doesn't, it just ignore the cast.

-- 
mk


support for unicode in identifiers

2014-06-01 Thread Vlad Levenfeld via Digitalmars-d-learn
I was pretty happy to find that I could use mu and sigma when 
writing statistical routines, but I've found that for more 
obscure non-ascii characters the support is hit or miss. For 
example, none of the subscripts are valid characters, but I can 
use superscript n as well as dot-notation for derivatives.
I'm using dmd 2.065. What's the story behind the scenes? Is there 
a rationale behind the supported/unsupported or is it 
happenstance? Is there anywhere I can find a list of supported 
characters?


How to detect a lambda expression get it is signature

2014-06-01 Thread bioinfornatics via Digitalmars-d-learn

Hi i am looking how to perform this action with traits. Below
some code to show what it fail


Regards


 CODE
import std.traits   : isDelegate, isSomeFunction,
MemberFunctionsTuple, ParameterIdentifierTuple;


struct section( alias start, alias end )
{
 alias checkStart = start;
 alias checkEnd = end;
}

void main()
{
 alias tmp = bool delegate( string ); // what i would like to
get
 alias s = section!( (word) = word ==a , (word) = word ==
b );
 pragma( msg, isSomeFunction!(s.checkStart) );   //
false
 pragma( msg, isDelegate!(s.checkStart) );   //
false
 pragma( msg, __traits(identifier, s.checkStart) );  //
__lambda1
 pragma( msg, ParameterIdentifierTuple!(s.checkStart) ); //
error
 pragma( msg, MemberFunctionsTuple!( s.checkStart ) );   //
error
}


Re: DMD fail when using both reflection and UDA

2014-06-01 Thread bioinfornatics via Digitalmars-d-learn

On Sunday, 1 June 2014 at 16:18:45 UTC, Philippe Sigaud via
Digitalmars-d-learn wrote:
In any case, it's an internal compiler error, so it's a bug. 
Users

should never see ICEs.
Could you please report it, with the entire error message?


Ok thanks is don at https://issues.dlang.org/show_bug.cgi?id=12838


Re: support for unicode in identifiers

2014-06-01 Thread Chris Nicholson-Sauls via Digitalmars-d-learn

On Sunday, 1 June 2014 at 22:26:42 UTC, Vlad Levenfeld wrote:
I was pretty happy to find that I could use mu and sigma when 
writing statistical routines, but I've found that for more 
obscure non-ascii characters the support is hit or miss. For 
example, none of the subscripts are valid characters, but I can 
use superscript n as well as dot-notation for derivatives.
I'm using dmd 2.065. What's the story behind the scenes? Is 
there a rationale behind the supported/unsupported or is it 
happenstance? Is there anywhere I can find a list of supported 
characters?


The allowed characters are those defined as universal in 
ISO/IEC 9899 (the C standard).  It's a pretty long list, but 
almost only alphas; I'm actually surprised you got superscripts 
and some other things to work.


As I understand it, the intention was a) be like C99, and b) 
allow things like using stærð rather than staerdh.  I'm not 
sure usage like yours was even thought about, although I'd 
concede that it seems reasonable.


Re: support for unicode in identifiers

2014-06-01 Thread Vlad Levenfeld via Digitalmars-d-learn
With unicode support (especially with UCFS) I can really code 
more in the way I think. I never gave it much thought until I 
worked with D, but now that I have I feel it is a bit weird to 
work with epsilons and deltas on paper and eps and del or 
something on the screen. And what's a more descriptive variable 
name than the symbol used for it in the canonical representations?


So, this may be a very naive question but I wonder, since dmd is 
open source, is there somewhere that the list of supported 
symbols can be extended? (hopefully something trivial to change, 
like a big array literal tucked away somewhere) I'm looking 
through the files labeled 'lexer' and 'utf' and things like that 
on github currently, but nothing's jumped out at me yet.


Re: support for unicode in identifiers

2014-06-01 Thread Vlad Levenfeld via Digitalmars-d-learn

Ah!, found it in utf.h as ALPHA_TABLE


Multi-file project problem with Visual D

2014-06-01 Thread Mike via Digitalmars-d-learn
I've created a small Windows based program using a win32 library 
I found online.   That part is working just fine.


I've also created a second file (called util.d) and within it 
defined a class called MyData (with a member function called 
Read()).


Within my main program I instantiate and try to call the Read() 
method.  No errors are generated but nothing gets called.   Right 
now the Read() method just does a throw so I know something is 
going on.


What am I missing here?   I would think the compiler would 
generate an error if something was missing.


winmain.d:
-
extern(Windows)
LRESULT WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM 
lParam)

{

switch (message)
{
case WM_CREATE:
f.Read() ;
return 0 ;

 /* ... */

} // WndProc



util.d:
--

class MyData {
public:
void Read() {
throw new Exception(No!, __FILE__, __LINE__) ;
} // void Read()
} // class Data



Re: Multi-file project problem with Visual D

2014-06-01 Thread Mike via Digitalmars-d-learn

On Monday, 2 June 2014 at 01:01:22 UTC, Mike wrote:
I've created a small Windows based program using a win32 
library I found online.   That part is working just fine.


I've also created a second file (called util.d) and within it 
defined a class called MyData (with a member function called 
Read()).


Within my main program I instantiate and try to call the Read() 
method.  No errors are generated but nothing gets called.   
Right now the Read() method just does a throw so I know 
something is going on.


What am I missing here?   I would think the compiler would 
generate an error if something was missing.


winmain.d:
-
extern(Windows)
LRESULT WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM 
lParam)

{

switch (message)
{
case WM_CREATE:
f.Read() ;
return 0 ;

 /* ... */

} // WndProc



util.d:
--

class MyData {
public:
void Read() {
throw new Exception(No!, __FILE__, __LINE__) ;
} // void Read()
} // class Data



Doing more testing and debugging found that the value of the 
instance is 0, which leads me to believe something is happening 
with the instantiation.   Back to the books I suppose.


Re: Indicating incompatible modules

2014-06-01 Thread Jonathan M Davis via Digitalmars-d-learn
On Sat, 31 May 2014 18:26:53 +0200
Joseph Rushton Wakeling via Digitalmars-d-learn
digitalmars-d-learn@puremagic.com wrote:

 Hello all,

 Is there a straightforward way to indicate that two modules should
 not be used together in the same program?  Preferably one that does
 not require editing both of the modules?

 The application I have in mind is when one is making available an
 experimental module which is planned to replace one that already
 exists; it's useful for the experimental module to be able to say,
 Hey, use me _or_ the standard module, but not both of us.

 Any thoughts ... ?

I wouldn't really worry about it. I'd just document the new module as a
replacement for the other and that they're not intended to work together. I
don't see much point in trying to get the compiler to complain about code that
uses both.

- Jonathan M Davis


Re: Forward reference to nested function not allowed?

2014-06-01 Thread Jonathan M Davis via Digitalmars-d-learn
On Sat, 31 May 2014 16:18:33 +
DLearner via Digitalmars-d-learn digitalmars-d-learn@puremagic.com
wrote:

 Hi,

 import std.stdio;
 void main() {

 writefln(Entered);

 sub1();
 sub1();
 sub1();

 writefln(Returning);

 void sub1() {
static int i2 = 6;

i2 = i2 + 1;
writefln(%s,i2);
 };
 }

 does not compile, but

 import std.stdio;
 void main() {
 void sub1() {
static int i2 = 6;

i2 = i2 + 1;
writefln(%s,i2);
 };
 writefln(Entered);

 sub1();
 sub1();
 sub1();

 writefln(Returning);


 }

 compiles and runs as expected.

 Is this intended?

Currently, you cannot forward reference a nested function. Kenji was looking
into it recently, so maybe we'll be able to at some point in the future, but
right now, we definitely can't. But even if we can in the future, I'd expect
that you'd have to declare a prototype for the function to be able to use it
before it's declared. In general though, I think that the only reason that it
would really be useful would be to have two nested functions refer to each
other, since otherwise, you just declare the nested function earlier in the
function.

- Jonathan M Davis


Re: Are tests interruptible/concurrent? Is use of a (thread local) global safe in tests?

2014-06-01 Thread Jonathan M Davis via Digitalmars-d-learn
On Fri, 30 May 2014 20:13:19 +
Mark Isaacson via Digitalmars-d-learn
digitalmars-d-learn@puremagic.com wrote:

 I'm having fun running some unittests. I set up a simple homemade
 mock of std.net.curl's functions that essentially just consists
 of a global queue that I can add strings to and get back in a
 predictable order when calling std.net.curl.get/post/etc.

 I use this mock in a couple of different modules for unit
 testing, namely the module I have the mock in and one other one.
 When I run my unit tests, it seems to enqueue all of the
 responses from both of my unit tests (from different modules)
 before finishing those tests and removing things from the global
 queue. This is problematic in that I cannot anticipate the state
 of the global queue for my tests. Does this sound more like a bug
 or a feature. My understanding is that, at least for now, tests
 are not run concurrently on the latest official dmd release;
 since my queue is not qualified with shared, things should be
 thread local anyway.

 TLDR:
 Executation of tests A and B is as follows:
 A pushes to global queue
 B pushes to global queue
 B pops on global queue -- program crashes

 Expected order:
 A pushes to global queue
 A pops from global queue
 B pushes to global queue
 B pops from global queue

 Or switch the order in which A and B execute, doesn't really
 matter.


Well, the behavior you're seeing would make sense if you're using static
destructors for the popping part, since they aren't going to be run until the
program is shut down, but if you're using the unittest blocks to do the
popping, that's definitely a bit odd. I would have expected each module's unit
tests to be run sequentially. Certainly, within a module, the tests are
currently run sequentially. However, there has been recent discussion of
changing it so that unittest blocks will be run in parallel (at lest by
default), so in the future, they may very well run in parallel (probably
requiring an attribute of some kind to make them run sequentially).

It's generally considered good practice to make it so that your unittest
blocks don't rely on each other and that they don't change the global state,
in which case, it doesn't matter what order they're in (though that still
allows for setting stuff up in static constructors and shutting it down in
static destructors so long as that state doesn't change after a unittest block
is run).

- Jonathan M Davis


Re: floating point conversion

2014-06-01 Thread Jonathan M Davis via Digitalmars-d-learn
On Sun, 01 Jun 2014 14:42:34 +
Famous via Digitalmars-d-learn digitalmars-d-learn@puremagic.com
wrote:

 On Sunday, 1 June 2014 at 12:45:26 UTC, bearophile wrote:
  It's a bad question.

 Actually, Martin's question is a good one.

 Initializing a variable of type float via a literal or as
 conversion from string should be the same, exacly, always.
 Casting a float to double should be deterministic as well.

Not necessarily, particularly because any floating point operations done at
compile time are generally done at much higher precision than those done at
runtime. So, it's pretty trivial for very similar floating point operations to
end up with slightly different results. In general, expecting any kind of
exactness from floating point values is asking for trouble. Sure, they follow
the rules that they have consistently, but there are so many numbers that
aren't actually representable by a floating point value, the precisions vary
just enough, and slightly different code paths can result in slightly
different results that depending on floating point operations resulting in
any kind of specific values except under very controlled circumstances just
isn't going to work.

- Jonathan M Davis