Re: As many thanks As possible to who crates D and UFCS feature

2017-05-13 Thread k-five via Digitalmars-d-learn

On Friday, 12 May 2017 at 20:53:56 UTC, Bastiaan Veelo wrote:

Is it safe to say that these 40 lines of D do the same as your 
324 lines of C++ [1]?


No. I cannot say that.
Since this is not a full port of renrem in C++ to D. It was just 
an example in D, nothing else.


This, and your comments on the difficulties of building renrem 
[2] versus doing "rdmd", and the steepness of the learning 
curve (1 year C++ vs 2 weeks D), and the productivity (2 hours 
D vs ?? C++)


I am not sure about understanding your purpose correctly.


I think are plenty material for a nice little blog.


Which English Grammar rule is used here? Sorry but I do not know!
are: linking verb after
think: main verb and subject!
---
I just want to say D is easy to learn and use; that is it. I have 
no arguing about which Language is better no not. Of course that 
program with C++, took me 1 month until it got ready, but in 2 
days I could ported to D, since I had the already experience of 
implementing it.



Mike Parker runs the D blog, and I think he might be 
interested. No need to worry about the english language, you 
are safe with Mike. I'll see if I can get you his attention.


Sorry ... Still could not understand ... except you may want me 
to put such post in D blog not here, and in this case, your are 
right, the best way for such examples is on a blog or similar. 
Sorry for posting it here.





Re: SysTime.fromISOString

2017-05-13 Thread Jonathan M Davis via Digitalmars-d-learn
On Saturday, May 13, 2017 07:33:35 Russel Winder via Digitalmars-d-learn 
wrote:
> A priori I thought 2015 was a perfectly valid ISO8601 date-time
> specification. It appears that SysTime.fromISOString disagrees:
>
> core.time.TimeException@/usr/include/d/std/datetime.d(8553): Invalid
> ISO String: 2015
>
> So am I right or wrong.
> https://en.wikipedia.org/wiki/ISO_8601https://en.wikipedia.org/wiki/ISO_8
> 601

The ISO representation of a date is MMDD, and the extended ISO
representation is -MM-DD.  would be a truncated representation. The
standard has language such as "If, by agreement, truncated representations
are used" to talk about truncated representations, but it's not part of the
actual, standard string representation. It's just giving guidance on what
applications should do if they decide to not use the full string
representation when communicating with one another, and it's not expected
that an application that supports the standard would support truncated
representations. It's only "by agreement," between two applications, not
standard. std.datetime only supports the full, standard string
representation, and for SysTime, that also includes the time, not just the
date. std.datetime.Date would be the closest, but it represents a date, not
just a year, so it's MMDD or -MM-DD. If you want to pass a string to
SysTime.fromISOString, it's going to need to be MMDDTHHMMSS (optionally
with fractional seconds and a time zone).

And really, there isn't much useful that can be done with a SysTime that was
constructed from just a year anyway. The best SysTime could do would be to
assume you meant 2015-01-01T00:00:00. It operates on the system time in
hecto-nanoseconds and really isn't meant be operating on dates (that's what
Date and DateTime are for). Converting 2015 to a SysTime with no information
would be like trying to construct a time_t in C with just 2015. That usually
doesn't make much sense. Nothing in std.datetime operates simply on a year.
The closest that you're going to get to that is Date.

Regardless, if you know that you're just dealing with a year, and that's it,
you can just call to!int on it and pass it to the constructor of SysTime,
DateTime, or Date (depending on which you want to use) with whatever values
you want to set for the month, day, etc. Using a function like fromISOString
would just be overkill if all you have is a year, even if it did accept
truncated representations. But the truncated representations are not
required by the standard, so they're not supported.

- Jonathan M Davis



Re: How to avoid throwing an exceptions for a built-in function?

2017-05-13 Thread k-five via Digitalmars-d-learn

On Saturday, 13 May 2017 at 02:40:17 UTC, Mike B Johnson wrote:


You are not making a lot of sense:

1. Exception do bubble up, so you don't need to "handle" 
exceptions at the call site if you don't want to. The whole 
point of exceptions is do effectively do what you want.


2. You say that you don't have to deal with it in your code but 
you are trying to deal with it now.



You are not clear on exactly what you are trying to accomplish.

Can you be more specific on why you do not want to add a 
try/catch/if-else/ifThrown/etc? Is it because you don't need to 
handle it in your own usage? If that is true, will others ever 
use it?


Basically all you have to do is ask yourself this:

"Do I need to EVER handle the case where the data is invalid?"

If you do(e.g., other users will use your code) then you better 
implement some type of exception handling. Else all you have to 
do is always put in the right data(not good because it might 
bite you in the ass one day).


If you just want less noise when the program crashes, just put 
a try/catch block in main and catch all generic exceptions and 
exit with a simple error message like "There was an ERROR, I do 
not know why...".




Way arguing when a simple code can clarify the subject? right?
If am not clear so consider me as an stupid man, no problem at 
all.


but CAN you please solve it for me?

import std.stdio:   writeln;
import std.conv:to;

void main( string[] args ){

string str = "10";
int index;
index = to!int( str );  // okay, no exception are thrown

str = "some-words";
index = to!int( str ); // problem, an exception is thrown

}

Please run this code and convert "some-words" to int by using to! 
function without facing any exception. Thanks




Re: How to avoid throwing an exceptions for a built-in function?

2017-05-13 Thread Jonathan M Davis via Digitalmars-d-learn
On Friday, May 12, 2017 10:42:18 H. S. Teoh via Digitalmars-d-learn wrote:
> On Fri, May 12, 2017 at 12:47:04PM +0200, ag0aep6g via Digitalmars-d-learn 
wrote:
> > On 05/12/2017 10:32 AM, k-five wrote:
> > > Interesting! I was worried about performance and for that I did not
> > > want to use try-catch.
> > > So (isNumberic) is a good solution.
> > > http://dlang.org/phobos/std_traits.html#isNumeric
> >
> > If you're doing this for speed, you better be benchmarking. Exceptions
> > are slow when they're thrown. But if no exception is being thrown,
> > try-catch is probably faster than checking isNumeric beforehand.
>
> Yes, when it comes to performance-related issues, always profile,
> profile, profile. (Or benchmark, benchmark, benchmark. Anything that
> gives you actual measurements rather than subjective judgment calls.)
> Far too often, what we think will perform poorly is actually nowhere
> near the real bottleneck in the program, and we end up wasting too much
> time "optimizing" something that doesn't even make a noticeable
> difference in the end. Whereas, using a profiler early on will help you
> zero in on the real bottlenecks, and you could potentially make huge
> performance savings with much less effort.

For the most part, when parsing a string, std.conv.to's approach of just
parsing the string and throwing an exception if/when it fails is the most
efficient, because it's only going to parse the string once, whereas calling
a function to validate the string's format and _then_ do the conversion
would mean parsing the string twice. It's just that if you are in a
situation where the string is likely not to be in the correct format, then
having a bunch of exceptions thrown will harm performance. To best handle
that, we'd need an alternate conversion function that did something like
return the failure condition and passed the result via an out parameter or
one which took a default value and returned that on failure instead of what
was actaully parsed. So, ideally, we'd have other functions in std.conv to
handle such cases, but in the vast majority of cases, throwing an exception
on failure is going to be the most efficient solution.

But obviously, to know what's actually happening with your code, you're
going to have to profile and benchmark it - especially if you're throwing
exceptions on a regular basis but not super frequently, because then it's
quickly an open question as to whether parsing twice to avoid the exception
or letting the exception be thrown and caught would be faster.

Odds are though that unless you're converting in a tight loop, the relative
costs won't matter much, even if one is clearly more expensive than the
other, simply because it's not a bottleneck in your program. But you won't
know that for sure unless you profile.

However, unless you're parsing a lot of invalid strings, I'd be very
surprised if always parsing twice were more efficient than parsing only once
and throwing an exception on failure. And D exceptions are fairly efficient
at this point if you don't call toString, because we stripped out most of
the string processing that they were doing up front before. It used to be
pretty painful when you did a lot of tests that tested the error cases,
because the exceptions really increased the time that the tests took, but
that's no longer the case (IIRC, the improvements literally saved seconds of
execution time in std.datetime's unit tests).

- Jonathan M Davis



Re: Lookahead in unittest

2017-05-13 Thread Jonathan M Davis via Digitalmars-d-learn
On Friday, May 12, 2017 14:46:30 H. S. Teoh via Digitalmars-d-learn wrote:
> On Fri, May 12, 2017 at 05:23:23PM -0400, Steven Schveighoffer via
> Digitalmars-d-learn wrote: [...]
>
> > Note, you can achieve what you want with version(unittest):
> >
> > version(unittest)
> > {
> >
> >class A { B b; }
> >class B { }
> >
> > }
> >
> > unittest
> > {
> >
> >// use A and B here
> >
> > }
>
> [...]
>
> This advice, unfortunately, needs to be tempered with caution about
> namespace pollution and accidental dependency of things outside
> unittests on things inside a version(unittest) block.  There's also the
> issue of library code introducing extraneous import dependencies that
> are really only necessary for unittesting, but get pulled in anyway
> because user code happens to compile with -unittest.

Yeah, that can get annoying, though I think that the only real problem in
general is imports. If you use version(unittest) on imports, then you run
the risk of having imports that are required for normal operation being only
available when you compile with -unittest and not catching it. But unless
you have a problem using version(unittest) types or functions in your actual
code (which would be kind of weird), then I wouldn't expect it to be a
problem.

However, in many cases, it makes sense to just move the declarations into
the unittest blocks (especally if they're only used in one unittest block),
and then you avoid the whole problem (though in this case, you'd want to
mark the classes as static if you put them in the unittest block).

- Jonathan M Davis



Re: std.getopt and std.datetime

2017-05-13 Thread Jonathan M Davis via Digitalmars-d-learn
On Saturday, May 13, 2017 06:53:25 Russel Winder via Digitalmars-d-learn 
wrote:
> Is there a canonical, idiomatic way of processing std.datetime objects
> using std.getopt?
>
> Currently, I am suffering:
>
> /usr/include/d/std/getopt.d(921): Error: static assert  "Dunno how to deal
> with type SysTime*"
>
> which on the one hand is understandable, albeit dreadful English, but
> then I suppose it is American not English

At best, it's slang. It's not proper anything.

https://github.com/dlang/phobos/pull/5388

- Jonathan M Davis



Re: How to avoid throwing an exceptions for a built-in function?

2017-05-13 Thread Stanislav Blinov via Digitalmars-d-learn

On Saturday, 13 May 2017 at 08:50:20 UTC, k-five wrote:


Way arguing when a simple code can clarify the subject? right?
If am not clear so consider me as an stupid man, no problem at 
all.


but CAN you please solve it for me?

import std.stdio:   writeln;
import std.conv:to;

void main( string[] args ){

string str = "10";
int index;
index = to!int( str );  // okay, no exception are thrown

str = "some-words";
index = to!int( str ); // problem, an exception is thrown

}

Please run this code and convert "some-words" to int by using 
to! function without facing any exception. Thanks


Please don't take it the wrong way. It just seems that Mike was 
as confused by your questions as I was initially. But it's clear 
that's just the language barrier, nothing more. See, you said:


Why I do not want to take care of that? Because I just need the 
value, if the string is valid, otherwise no matter what the 
value of string is.


...but it doesn't make sense to have an int "value" for a string 
like "some-words". *Unless* one defines a "not-a-number" 
equivalent for an int, i.e. 0 or some other value. That part was 
hard to infer from what you were saying :) It might've been 
obvious for you, but hard to understand from what you wrote.


This was what made things clear:


I just want to silent this exception...


Mostly, the source of the confusion was the "I don't want to 
handle the exception". But in fact what you were asking was was 
there a way to somehow ignore the exception and just return some 
predefined value in case of an error. So in fact, you did want to 
handle the exception (or rather, an exceptional case), you just 
wanted to do it without inserting control flow instructions 
(try/catch) into your code. I think the latter part already got 
covered in others' replies.


Nobody was trying to insult you. With this being a multi-lingual 
and multi-cultural community, remember that understanding goes 
both ways, and we're sometimes caught right in the middle, in the 
clash of mentalities.


Re: How to avoid throwing an exceptions for a built-in function?

2017-05-13 Thread k-five via Digitalmars-d-learn

On Saturday, 13 May 2017 at 09:05:17 UTC, Jonathan M Davis wrote:

For the most part, when parsing a string, std.conv.to's 
approach of just parsing the string and throwing an exception 
if/when it fails is the most efficient, because it's only going 
to parse the string once, whereas calling a function to 
validate the string's format and _then_ do the conversion would 
mean parsing the string twice.It's just that if you are in a 
situation where the string is likely not to be in the correct 
format, then having a bunch of exceptions thrown will harm 
performance. To best handle that, we'd need an alternate 
conversion function that did something like return the failure 
condition and passed the result via an out parameter or one 
which took a default value and returned that on failure instead 
of what was actaully parsed. So, ideally, we'd have other 
functions in std.conv to handle such cases, but in the vast 
majority of cases, throwing an exception on failure is going to 
be the most efficient solution.


I did not know this.

But obviously, to know what's actually happening with your 
code, you're going to have to profile and benchmark it -


Can you please give a link or page or something to read about 
profile or benchmark. I have no experience with those.


---

For a such purpose I already used std::stringstream in C++, and I 
assumed may or may not D has a such family. ( to!, parse!, ... )


Not only an invalid string like "word" for to!int, makes it being 
thrown, but an empty string like: "" also makes it.


string str = "word";
int index = to!int( str ); // throws

str = "";
int index = to!int( str ); // throws, as well!

Of course throwing is useful some times, but definitely not 
ALWAYS, and it is better to have a convert function that never 
throws anything.


Although [Andrei Alexandrescu] told me that the parse! family is 
used for such a case:
Use the "parse" family: 
https://dlang.org/phobos/std_conv.html#parse -- Andrei

but it throws as well.


Re: As many thanks As possible to who crates D and UFCS feature

2017-05-13 Thread Bastiaan Veelo via Digitalmars-d-learn

On Saturday, 13 May 2017 at 08:23:55 UTC, k-five wrote:

On Friday, 12 May 2017 at 20:53:56 UTC, Bastiaan Veelo wrote:

Is it safe to say that these 40 lines of D do the same as your 
324 lines of C++ [1]?


No. I cannot say that.
Since this is not a full port of renrem in C++ to D. It was 
just an example in D, nothing else.


OK understood.

This, and your comments on the difficulties of building renrem 
[2] versus doing "rdmd", and the steepness of the learning 
curve (1 year C++ vs 2 weeks D), and the productivity (2 hours 
D vs ?? C++)


I am not sure about understanding your purpose correctly.


I think are plenty material for a nice little blog.


Which English Grammar rule is used here? Sorry but I do not 
know!

are: linking verb after
think: main verb and subject!


I am sorry for expressing myself poorly. What I meant to say is 
that it looked like you can write an interesting article about 
your experience learning and using C++ and learning and using D, 
comparing the two. D could come out of that comparison favourably 
considering 1) how long it takes to learn, 2) how much code you 
need to write, 3) whether there are difficulties along the way, 
and 4) how productive you can be (getting things done). I may 
have been jumping to conclusions, but it could still be an 
interesting read, especially for people that consider learning 
C++ or D. In particular the focus on UFCS is interesting, as that 
can be rather alien to beginners, and something you are 
enthusiastic about.


I just want to say D is easy to learn and use; that is it. I 
have no arguing about which Language is better no not. Of 
course that program with C++, took me 1 month until it got 
ready, but in 2 days I could ported to D, since I had the 
already experience of implementing it.


Understood.

Mike Parker runs the D blog, and I think he might be 
interested. No need to worry about the english language, you 
are safe with Mike. I'll see if I can get you his attention.


Sorry ... Still could not understand ... except you may want me 
to put such post in D blog not here, and in this case, your are 
right, the best way for such examples is on a blog or similar. 
Sorry for posting it here.


Posting it here is fine. You could also have posted in the 
general forum, as it is more of a compliment than a question. But 
if you want to write more about your positive experience, then a 
blog article might be nice. It would reach more people, and it 
would maybe help some of them. If you want to do that work, then 
maybe Mike Parker would want to put it on the D blog, and help 
you polish it.


Whatever you decide to do, thanks for sharing your experience 
here :-)


Bastiaan.


Re: As many thanks As possible to who crates D and UFCS feature

2017-05-13 Thread k-five via Digitalmars-d-learn

On Saturday, 13 May 2017 at 10:15:34 UTC, Bastiaan Veelo wrote:

On Saturday, 13 May 2017 at 08:23:55 UTC, k-five wrote:

[...]


OK understood.


[...]


I am sorry for expressing myself poorly. What I meant to say is 
that it looked like you can write an interesting article about 
your experience learning and using C++ and learning and using 
D, comparing the two. D could come out of that comparison 
favourably considering 1) how long it takes to learn, 2) how 
much code you need to write, 3) whether there are difficulties 
along the way, and 4) how productive you can be (getting things 
done). I may have been jumping to conclusions, but it could 
still be an interesting read, especially for people that 
consider learning C++ or D. In particular the focus on UFCS is 
interesting, as that can be rather alien to beginners, and 
something you are enthusiastic about.



[...]


Understood.


[...]


Posting it here is fine. You could also have posted in the 
general forum, as it is more of a compliment than a question. 
But if you want to write more about your positive experience, 
then a blog article might be nice. It would reach more people, 
and it would maybe help some of them. If you want to do that 
work, then maybe Mike Parker would want to put it on the D 
blog, and help you polish it.


Whatever you decide to do, thanks for sharing your experience 
here :-)


Bastiaan.


On Saturday, 13 May 2017 at 10:15:34 UTC, Bastiaan Veelo wrote:

--

Okay, and NOW I understood what you are trying to say.
First of all I thought you got mad at me. And I became sad. 
Since; I tell this really that I was so happy about the code in 
D, that I would want to share my happiness here with others and 
not expressing myself. Still I am a beginner and learner.

Thanks anyway.



Re: As many thanks As possible to who crates D and UFCS feature

2017-05-13 Thread Bastiaan Veelo via Digitalmars-d-learn

On Saturday, 13 May 2017 at 10:51:09 UTC, k-five wrote:

Okay, and NOW I understood what you are trying to say.
First of all I thought you got mad at me. And I became sad.


My sincere apologies! Always assume the best in people :-) I am 
glad you asked for clarification.



[...] Still I am a beginner and learner.


I am too, and learners we are all.


Thanks anyway.


Welcome.



Re: SysTime.fromISOString

2017-05-13 Thread Russel Winder via Digitalmars-d-learn
On Sat, 2017-05-13 at 01:52 -0700, Jonathan M Davis via Digitalmars-d-
learn wrote:
> […]
> The ISO representation of a date is MMDD, and the extended ISO
> representation is -MM-DD.  would be a truncated
> representation. The
> standard has language such as "If, by agreement, truncated
> representations
> are used" to talk about truncated representations, but it's not part
> of the
> actual, standard string representation. It's just giving guidance on
> what
> applications should do if they decide to not use the full string
> representation when communicating with one another, and it's not
> expected
> that an application that supports the standard would support
> truncated
> representations. It's only "by agreement," between two applications,
> not
> standard. std.datetime only supports the full, standard string
> representation, and for SysTime, that also includes the time, not
> just the
> date. std.datetime.Date would be the closest, but it represents a
> date, not
> just a year, so it's MMDD or -MM-DD. If you want to pass a
> string to
> SysTime.fromISOString, it's going to need to be
> MMDDTHHMMSS (optionally
> with fractional seconds and a time zone).

My reading is that -MM is an allowed form: I was wrong to suggest
 was allowed.

For times hh:mm is allowed as well as hh:mm:ss.

fromIsoString should allow for MMDDTHHMMSS and -MM-DDThh:mm:ss
shouldn't it?

> And really, there isn't much useful that can be done with a SysTime
> that was
> constructed from just a year anyway. The best SysTime could do would
> be to
> assume you meant 2015-01-01T00:00:00. It operates on the system time
> in
> hecto-nanoseconds and really isn't meant be operating on dates
> (that's what
> Date and DateTime are for). Converting 2015 to a SysTime with no
> information
> would be like trying to construct a time_t in C with just 2015. That
> usually
> doesn't make much sense. Nothing in std.datetime operates simply on a
> year.
> The closest that you're going to get to that is Date.

I agree I need to construct a Date or  DateTime from the string and
then a SysTime from that. I was just being lazy earlier.
 
> Regardless, if you know that you're just dealing with a year, and
> that's it,
> you can just call to!int on it and pass it to the constructor of
> SysTime,
> DateTime, or Date (depending on which you want to use) with whatever
> values
> you want to set for the month, day, etc. Using a function like
> fromISOString
> would just be overkill if all you have is a year, even if it did
> accept
> truncated representations. But the truncated representations are not
> required by the standard, so they're not supported.

Indeed. However I believe the standard defines more than is accepted.
The code:

auto newDate = Date.fromISOString(date_buffer);

leads to:

core.time.TimeException@/usr/include/d/std/datetime.d(12932): Invalid ISO 
String: 2015-05-10

I'd suggest 2015-05-10 is a perfectly good ISO8601 compliant date and
so highlights a bug/

-- 
Russel.
=
Dr Russel Winder  t: +44 20 7585 2200   voip: sip:russel.win...@ekiga.net
41 Buckmaster Roadm: +44 7770 465 077   xmpp: rus...@winder.org.uk
London SW11 1EN, UK   w: www.russel.org.uk  skype: russel_winder

signature.asc
Description: This is a digitally signed message part


Re: std.getopt and std.datetime

2017-05-13 Thread Russel Winder via Digitalmars-d-learn
On Sat, 2017-05-13 at 02:23 -0700, Jonathan M Davis via Digitalmars-d-
learn wrote:
> 
[…]
> At best, it's slang. It's not proper anything.
> 
> https://github.com/dlang/phobos/pull/5388
> 
> - Jonathan M Davis

Indeed. Thanks for getting a pull request in to ameliorate the
difficulty.

-- 
Russel.
=
Dr Russel Winder  t: +44 20 7585 2200   voip: sip:russel.win...@ekiga.net
41 Buckmaster Roadm: +44 7770 465 077   xmpp: rus...@winder.org.uk
London SW11 1EN, UK   w: www.russel.org.uk  skype: russel_winder

signature.asc
Description: This is a digitally signed message part


Re: SysTime.fromISOString

2017-05-13 Thread Jonathan M Davis via Digitalmars-d-learn
On Saturday, May 13, 2017 12:06:57 Russel Winder via Digitalmars-d-learn 
wrote:
> On Sat, 2017-05-13 at 01:52 -0700, Jonathan M Davis via Digitalmars-d-
> learn wrote:
> My reading is that -MM is an allowed form: I was wrong to suggest
>  was allowed.

-MM is still truncated and therefore only permitted if applications
agree to it.

> For times hh:mm is allowed as well as hh:mm:ss.

Rereading the spec, yes, HH:MM is permitted instead of HH:MM:SS, but HH is
not, and any truncation of -MM-DD is considered a truncation and
therefore only permitted if the applications involved agree to it.

So, arguably fromISOString and fromISOExtString should be changed to allow
HHMM and HH:MM respectively but not HH, -MM, MM, or .

> fromIsoString should allow for MMDDTHHMMSS and -MM-DDThh:mm:ss
> shouldn't it?

MMDDTHHMMSS is the ISO basic format, and -MM-DDTHH:MM:SS is the ISO
extended format (so, they're both from the same standard, but they're not
the same format). fromISOString handles the ISO basic format, and
fromISOExtString handles the ISO extended format.

> > Regardless, if you know that you're just dealing with a year, and
> > that's it,
> > you can just call to!int on it and pass it to the constructor of
> > SysTime,
> > DateTime, or Date (depending on which you want to use) with whatever
> > values
> > you want to set for the month, day, etc. Using a function like
> > fromISOString
> > would just be overkill if all you have is a year, even if it did
> > accept
> > truncated representations. But the truncated representations are not
> > required by the standard, so they're not supported.
>
> Indeed. However I believe the standard defines more than is accepted.
> The code:
>
> auto newDate = Date.fromISOString(date_buffer);
>
> leads to:
>
> core.time.TimeException@/usr/include/d/std/datetime.d(12932): Invalid ISO
> String: 2015-05-10
>
> I'd suggest 2015-05-10 is a perfectly good ISO8601 compliant date and
> so highlights a bug/

fromISOString is throwing, because you're giving it the extended format. For
that, you need to use fromISOExtString.

- Jonathan M Davis



Re: SysTime.fromISOString

2017-05-13 Thread Russel Winder via Digitalmars-d-learn
And this seems awkward:


auto date = Clock.currTime();
auto date_buffer = date.toISOString();
…
try {
date = SysTime.fromISOString(date_buffer);
} catch (DateTimeException dte) {
try {
date =
SysTime(DateTime.fromISOString(date_buffer));
} catch (DateTimeException ddttee) {
date =
SysTime(Date.fromISOString(date_buffer));
}
}

Even though it works, well with 20150510 if not 2015-05-10.

I suspect I am doing it wrong. :-)

-- 
Russel.
=
Dr Russel Winder  t: +44 20 7585 2200   voip: sip:russel.win...@ekiga.net
41 Buckmaster Roadm: +44 7770 465 077   xmpp: rus...@winder.org.uk
London SW11 1EN, UK   w: www.russel.org.uk  skype: russel_winder

signature.asc
Description: This is a digitally signed message part


Re: SysTime.fromISOString

2017-05-13 Thread Russel Winder via Digitalmars-d-learn
On Sat, 2017-05-13 at 04:24 -0700, Jonathan M Davis via Digitalmars-d-
learn wrote:
> […]
> 
> -MM is still truncated and therefore only permitted if
> applications
> agree to it.

But didn't that come is as standard in the 2000 standard along with --
MM-DD for yearless date?

> > For times hh:mm is allowed as well as hh:mm:ss.
> 
> Rereading the spec, yes, HH:MM is permitted instead of HH:MM:SS, but
> HH is
> not, and any truncation of -MM-DD is considered a truncation and
> therefore only permitted if the applications involved agree to it.

I'm still going to fight for -MM, but not to the extent of buying
the latest standard document from ISO!

> So, arguably fromISOString and fromISOExtString should be changed to
> allow
> HHMM and HH:MM respectively but not HH, -MM, MM, or .
> 
> > fromIsoString should allow for MMDDTHHMMSS and -MM-
> > DDThh:mm:ss
> > shouldn't it?
> 
> MMDDTHHMMSS is the ISO basic format, and -MM-DDTHH:MM:SS is
> the ISO
> extended format (so, they're both from the same standard, but they're
> not
> the same format). fromISOString handles the ISO basic format, and
> fromISOExtString handles the ISO extended format.

OK, we have my error, two different calls. Of course this means for a
string from the users you have to attempt a parse in one format and
then on exception try the other format. From a programmer perspective
trying to build a SysTime from user input is really awkward. Unless I
am missing a magic parse function.

> > > Regardless, if you know that you're just dealing with a year, and
> > > that's it,
> > > you can just call to!int on it and pass it to the constructor of
> > > SysTime,
> > > DateTime, or Date (depending on which you want to use) with
> > > whatever
> > > values
> > > you want to set for the month, day, etc. Using a function like
> > > fromISOString
> > > would just be overkill if all you have is a year, even if it did
> > > accept
> > > truncated representations. But the truncated representations are
> > > not
> > > required by the standard, so they're not supported.
> > 
> > Indeed. However I believe the standard defines more than is
> > accepted.
> > The code:
> > 
> > auto newDate = Date.fromISOString(date_buffer);
> > 
> > leads to:
> > 
> > core.time.TimeException@/usr/include/d/std/datetime.d(12932):
> > Invalid ISO
> > String: 2015-05-10
> > 
> > I'd suggest 2015-05-10 is a perfectly good ISO8601 compliant date
> > and
> > so highlights a bug/
> 
> fromISOString is throwing, because you're giving it the extended
> format. For
> that, you need to use fromISOExtString.

From the perspective of someone trying to parse "Input ISO format
string" really, really awkward. I do not want to use Vladimirs parse
since it copes with to many formats, I just want IS8601 compliant parse
(hence not using parse822Format.

You have pointed out why I was getting the error, but I think you can
accept that the tools that are there for converting strings to IS dates
need a bit of amendment to make them easy for programmers to work with.

-- 
Russel.
=
Dr Russel Winder  t: +44 20 7585 2200   voip: sip:russel.win...@ekiga.net
41 Buckmaster Roadm: +44 7770 465 077   xmpp: rus...@winder.org.uk
London SW11 1EN, UK   w: www.russel.org.uk  skype: russel_winder

signature.asc
Description: This is a digitally signed message part


Re: SysTime.fromISOString

2017-05-13 Thread Jonathan M Davis via Digitalmars-d-learn
On Saturday, May 13, 2017 12:31:38 Russel Winder via Digitalmars-d-learn 
wrote:
> And this seems awkward:
>
>
>   auto date = Clock.currTime();
>   auto date_buffer = date.toISOString();
> …
>   try {
>   date = SysTime.fromISOString(date_buffer);
>   } catch (DateTimeException dte) {
>   try {
>   date =
> SysTime(DateTime.fromISOString(date_buffer));
>   } catch (DateTimeException ddttee) {
>   date =
> SysTime(Date.fromISOString(date_buffer));
>   }
>   }
>
> Even though it works, well with 20150510 if not 2015-05-10.
>
> I suspect I am doing it wrong. :-)

Well, Clock.currTime() gives you a SysTime, not a Date. So, your date
variable is a SysTime, and date_buffer is going to be something like
"20170513T123138.12392". Calling SysTime.fromISOString will therefore work
on that without throwing, and calling either Date.fromISOString or
DateTime.fromISOString is going to throw, because Date doesn't support the
time (just the date), and DateTime doesn't support the fractional seconds or
a time zone (though you wouldn't currently get a time zone in this case,
because I still need to fix it so that LocalTime gives you a time zone for
to*String - if the time zone isn't there, then local time is assumed, so
what it's doing right now is technically correct, but it's error-prone).

std.datetime's from*String functions are designed to be fairly strict about
parsing, so you need to be fairly sure of what kind of string you're dealing
with. Certainly, you need to know whether you're dealing with the basic ISO
format or the extended ISO format, and you need to know which pieces are
going to be in the string. If it's going to be just the date (e.g.
2012-12-21), then you're going to need to use Date. If it's going to be just
the time (e.g. 04:19:22), then you're going to need to use TimeOfDay. If
it's going to be the date and the time (e.g. 2012-12-21T04:19:22), then you
can use either SysTime or DateTime, but if it's the data and the time and
includes the fractional seconds and/or a time zone (e.g.
2012-12-21T:04:19:22.0002, 2012-12-21T:04:19:22+08:00, or
2012-12-21T:04:19:22.0002+08:00), then you'll need to use SysTime, because
DateTime does not support either the fractional seconds or a time zone.

Each type is expecting a string with the pieces (date, time, fractional
seconds, and time zone) that it supports and that they'll all be there. The
only stuff that's optional is the fractional seconds and time zone when
dealing with SysTime, because the spec does not require that they be there.

If you were trying to be lax with the parsing and accept the various
combinations of what's legal, then you'd be stuck doing something like

SysTime st;
try
{
// If it's -MM-DDTHH:MM:SS.FFFZ
// If it's -MM-DDTHH:MM:SS.FFZ
// If it's -MM-DDTHH:MM:SS.FZ
// If it's -MM-DDTHH:MM:SS.Z
// If it's -MM-DDTHH:MM:SS.FFFZ
// If it's -MM-DDTHH:MM:SS.FFZ
// If it's -MM-DDTHH:MM:SS.FZ
// or  -MM-DDTHH:MM:SSZ
// or  -MM-DDTHH:MM:SS.FFF
// or  -MM-DDTHH:MM:SS.FF
// or  -MM-DDTHH:MM:SS.F
// or  -MM-DDTHH:MM:SS.
// or  -MM-DDTHH:MM:SS.FFF
// or  -MM-DDTHH:MM:SS.FF
// or  -MM-DDTHH:MM:SS.F
// or  -MM-DDTHH:MM:SS
st = SysTime.fromISOExtString(str);
}
catch(DateTimeException)
{
try
{
// If it's just -MM-DD
st = SysTime(Date.fromISOExtString(str));
}
catch(DateTimeException)
{
// If it's just HH:MM:SS
st = SysTime(Date.init, TimeOfDay.fromISOExtString(str));
}
}

But that would be downright bizarre in the case where it was just HH:MM:SS,
because then you'd end up with a SysTime on January 1st, 1 A.D. And while
getting just the date is less awkward, it's still kind off to then operate
on that as a SysTime. The time would always be at midnight.

Really, just parsing an "ISO formatted string" and allowing either the date
or time to be optional doesn't make much sense to me. That implies that you
don't really know what it's for, since the meaning of something that is just
a date and the meaning of something that is just a time are completely
different.

Regardless, std.datetime was designed with the idea that you knew whether
you were dealing with a date, a time, or both a date and a time when dealing
with ISO formatted strings.

- Jonathan M Davis




Re: How to avoid throwing an exceptions for a built-in function?

2017-05-13 Thread Bastiaan Veelo via Digitalmars-d-learn

On Saturday, 13 May 2017 at 09:51:40 UTC, k-five wrote:

On Saturday, 13 May 2017 at 09:05:17 UTC, Jonathan M Davis
But obviously, to know what's actually happening with your 
code, you're going to have to profile and benchmark it -


Can you please give a link or page or something to read about 
profile or benchmark. I have no experience with those.


Profiling:
Halfway down this page: http://www.digitalmars.com/ctg/trace.html

Two programs for visualising bottlenecks:
https://bitbucket.org/andrewtrotman/d-profile-viewer
https://code.dlang.org/packages/profdump

Benchmarking:
https://youtu.be/QELK73JSpFk?list=PL3jwVPmk_PRxo23yyoc0Ip_cP3-rCm7eB (fresh 
from DConf)
https://dlang.org/library/std/datetime/benchmark.html
https://code.dlang.org/packages/std_benchmark
https://code.dlang.org/packages/benchmarkplotter


Re: SysTime.fromISOString

2017-05-13 Thread Jonathan M Davis via Digitalmars-d-learn
On Saturday, May 13, 2017 12:56:31 Russel Winder via Digitalmars-d-learn 
wrote:
> On Sat, 2017-05-13 at 04:24 -0700, Jonathan M Davis via Digitalmars-d-
>
> learn wrote:
> > […]
> >
> > -MM is still truncated and therefore only permitted if
> > applications
> > agree to it.
>
> But didn't that come is as standard in the 2000 standard along with --
> MM-DD for yearless date?
>
> > > For times hh:mm is allowed as well as hh:mm:ss.
> >
> > Rereading the spec, yes, HH:MM is permitted instead of HH:MM:SS, but
> > HH is
> > not, and any truncation of -MM-DD is considered a truncation and
> > therefore only permitted if the applications involved agree to it.
>
> I'm still going to fight for -MM, but not to the extent of buying
> the latest standard document from ISO!

As I said, per the standard, -MM is a truncated representation, and
applications can agree that they'll support it, but it's not required. All
of the sections on truncated representations have language such as "If, by
agreement, truncated representations are used". Each of the from*String
functions are quite specific about what they support. The only portion
that's optional that std.datetime supports is the fractional seconds.

It looks like I need to make HHMM and HH:MM supported to completely follow
the spec (since that's considered a reduction in precision rather than a
truncation and is not listed as optional), but all of the various
truncations are considered optional by the spec and therefore not supported
by std.datetime (and supporting them risks problems with ambiguity - e.g.
you can't distinguish  from HHMM).

> > So, arguably fromISOString and fromISOExtString should be changed to
> > allow
> > HHMM and HH:MM respectively but not HH, -MM, MM, or .
> >
> > > fromIsoString should allow for MMDDTHHMMSS and -MM-
> > > DDThh:mm:ss
> > > shouldn't it?
> >
> > MMDDTHHMMSS is the ISO basic format, and -MM-DDTHH:MM:SS is
> > the ISO
> > extended format (so, they're both from the same standard, but they're
> > not
> > the same format). fromISOString handles the ISO basic format, and
> > fromISOExtString handles the ISO extended format.
>
> OK, we have my error, two different calls. Of course this means for a
> string from the users you have to attempt a parse in one format and
> then on exception try the other format. From a programmer perspective
> trying to build a SysTime from user input is really awkward. Unless I
> am missing a magic parse function.

> > fromISOString is throwing, because you're giving it the extended
> > format. For
> > that, you need to use fromISOExtString.
>
> From the perspective of someone trying to parse "Input ISO format
> string" really, really awkward. I do not want to use Vladimirs parse
> since it copes with to many formats, I just want IS8601 compliant parse
> (hence not using parse822Format.
>
> You have pointed out why I was getting the error, but I think you can
> accept that the tools that are there for converting strings to IS dates
> need a bit of amendment to make them easy for programmers to work with.

The expectation is that you know which format you're dealing with.
std.datetime is not written with the idea that you're dealing with a string
with an arbitrary date/time format, and it's going to figure out what it is.
It's written with the idea that you know exactly which format the string is
in, and it converts the string based on the rules for that format. The ISO
basic format and ISO extended format are two different formats. And in my
experience, when applications are exchanging information via ISO strings,
it's well-defined which format they're going to use. If you're actually
dealing with a situation where it's not well-defined, then yes, using
std.datetime becomes more painful.

A magic parsing function which supported both the ISO basic format and the
ISO extended format as well as the various truncated versions of those
formats could be written, but it would be very error-prone and in at least
some situations, it would be ambiguous, meaning that it could easily make
the wrong choice. Using the truncated forms really only works when two
applications have agreed on exactly how they're going to handle that, which
is likely the reason that the spec says that they're there for if
applications agree upon them rather than requiring that an application that
supports either the ISO basic format or the ISO extended format supports the
truncated versions.

- Jonathan M Davis




Re: SysTime.fromISOString

2017-05-13 Thread Russel Winder via Digitalmars-d-learn
On Sat, 2017-05-13 at 05:30 -0700, Jonathan M Davis via Digitalmars-d-
learn wrote:
> 
> […]

I can see I am not going to win the -MM discussion so I'll stand
down. Until I have read the latest version of the standard – I remain
sure this is a reduced accuracy not a truncated representation. But I
could just be wrong.

> The expectation is that you know which format you're dealing with.
> std.datetime is not written with the idea that you're dealing with a
> string
> with an arbitrary date/time format, and it's going to figure out what
> it is.
> It's written with the idea that you know exactly which format the
> string is
> in, and it converts the string based on the rules for that format.
> The ISO
> basic format and ISO extended format are two different formats. And
> in my
> experience, when applications are exchanging information via ISO
> strings,
> it's well-defined which format they're going to use. If you're
> actually
> dealing with a situation where it's not well-defined, then yes, using
> std.datetime becomes more painful.

I have just done the obvious cascaded try/catch block to try from the
most specific to the least specific, but I'll drop that here as you
have got stuck in to dealing with in the other email. (Which is great,
thanks for taking the time.)

> A magic parsing function which supported both the ISO basic format
> and the
> ISO extended format as well as the various truncated versions of
> those
> formats could be written, but it would be very error-prone and in at
> least
> some situations, it would be ambiguous, meaning that it could easily
> make
> the wrong choice. Using the truncated forms really only works when
> two
> applications have agreed on exactly how they're going to handle that,
> which
> is likely the reason that the spec says that they're there for if
> applications agree upon them rather than requiring that an
> application that
> supports either the ISO basic format or the ISO extended format
> supports the
> truncated versions.

I think my situation is not the general case so actually I have no
problem. But I shall shift this to the other thread.

-- 
Russel.
=
Dr Russel Winder  t: +44 20 7585 2200   voip: sip:russel.win...@ekiga.net
41 Buckmaster Roadm: +44 7770 465 077   xmpp: rus...@winder.org.uk
London SW11 1EN, UK   w: www.russel.org.uk  skype: russel_winder

signature.asc
Description: This is a digitally signed message part


Re: SysTime.fromISOString

2017-05-13 Thread Russel Winder via Digitalmars-d-learn
On Sat, 2017-05-13 at 05:03 -0700, Jonathan M Davis via Digitalmars-d-
learn wrote:
> 
[…]
> SysTime st;
> try
> {
> // If it's -MM-DDTHH:MM:SS.FFFZ
> // If it's -MM-DDTHH:MM:SS.FFZ
> // If it's -MM-DDTHH:MM:SS.FZ
> // If it's -MM-DDTHH:MM:SS.Z
> // If it's -MM-DDTHH:MM:SS.FFFZ
> // If it's -MM-DDTHH:MM:SS.FFZ
> // If it's -MM-DDTHH:MM:SS.FZ
> // or  -MM-DDTHH:MM:SSZ
> // or  -MM-DDTHH:MM:SS.FFF
> // or  -MM-DDTHH:MM:SS.FF
> // or  -MM-DDTHH:MM:SS.F
> // or  -MM-DDTHH:MM:SS.
> // or  -MM-DDTHH:MM:SS.FFF
> // or  -MM-DDTHH:MM:SS.FF
> // or  -MM-DDTHH:MM:SS.F
> // or  -MM-DDTHH:MM:SS
> st = SysTime.fromISOExtString(str);
> }
> catch(DateTimeException)
> {
> try
> {
> // If it's just -MM-DD
> st = SysTime(Date.fromISOExtString(str));
> }

A variation on this is where I have gone, so that you are not telling
me I am doing it wrong, means it is probably the least worst solution.
I do a cascade of attempting to construct using SysTime.fromISOString,
SysTime.fromISOExtString, DateTime.fromISOString,
DateTime.fromISOExtString, Date.fromISOString, Date.fromISAExtString
(creating a SysTime in the latter four cases obviously).

> catch(DateTimeException)
> {
> // If it's just HH:MM:SS
> st = SysTime(Date.init, TimeOfDay.fromISOExtString(str));
> }
> }

I haven't got to this stage as yet, but I suspect I am going to have
to.

> But that would be downright bizarre in the case where it was just
> HH:MM:SS,
> because then you'd end up with a SysTime on January 1st, 1 A.D. And
> while
> getting just the date is less awkward, it's still kind off to then
> operate
> on that as a SysTime. The time would always be at midnight.

I think you have to use the current date/time and extract the Date to
initialise. Times have to be in extended format to avoid the  HHMM
conflict you pointed out.

> Really, just parsing an "ISO formatted string" and allowing either
> the date
> or time to be optional doesn't make much sense to me. That implies
> that you
> don't really know what it's for, since the meaning of something that
> is just
> a date and the meaning of something that is just a time are
> completely
> different.

I disagree. There is now and some temporal location in the past.
Separating out durations makes that easy. Using a time means sometime
today before now or is an error. Using a date/time means before today
or is an error. This is not a general case, it is a specific need for
the use of two date/times, and it seems all viable to me. Actually I
can probably separate date/times and times as well as separating out
durations before now to make things easier.

> Regardless, std.datetime was designed with the idea that you knew
> whether
> you were dealing with a date, a time, or both a date and a time when
> dealing
> with ISO formatted strings.

I'll get round it. Now I have "from the horses mouth" the guidance
around my questions, I am fairly confident of where to go to achieve
the goal. It will not be pretty, but it will be doable without having
to create a magic parsing function.

Thanks for your exchanges on this, most constructive and most helpful.

-- 
Russel.
=
Dr Russel Winder  t: +44 20 7585 2200   voip: sip:russel.win...@ekiga.net
41 Buckmaster Roadm: +44 7770 465 077   xmpp: rus...@winder.org.uk
London SW11 1EN, UK   w: www.russel.org.uk  skype: russel_winder

signature.asc
Description: This is a digitally signed message part


Re: Access specifiers and visibility

2017-05-13 Thread John Colvin via Digitalmars-d-learn

On Wednesday, 10 May 2017 at 01:42:47 UTC, Andrew Edwards wrote:
Attempting to update a git repo to current D, I encounter the 
following deprecation messages:


src/glwtf/signals.d-mixin-256(256,2): Deprecation: 
glwtf.input.BaseGLFWEventHandler._on_key_down is not visible 
from module glwtf.signals
src/glwtf/signals.d-mixin-256(256,2): Deprecation: 
glwtf.input.BaseGLFWEventHandler._on_key_up is not visible from 
module glwtf.signals
src/glwtf/signals.d-mixin-256(256,2): Deprecation: 
glwtf.input.BaseGLFWEventHandler._on_mouse_button_down is not 
visible from module glwtf.signals
src/glwtf/signals.d-mixin-256(256,2): Deprecation: 
glwtf.input.BaseGLFWEventHandler._on_mouse_button_up is not 
visible from module glwtf.signals


Those error messages are often misleading. The name of the symbol 
alone is (often, always?) right but the module/package it says 
it's from is often nonsense. I often get deprecation messages 
saying things like "myPackage.myModule.to is not visible from 
module myPackage.myOtherModule", when the real problem is I 
forgot to import std.conv in myPackage.myOtherModule.


Re: Lookahead in unittest

2017-05-13 Thread Steven Schveighoffer via Digitalmars-d-learn

On 5/12/17 5:46 PM, H. S. Teoh via Digitalmars-d-learn wrote:

On Fri, May 12, 2017 at 05:23:23PM -0400, Steven Schveighoffer via 
Digitalmars-d-learn wrote:
[...]

Note, you can achieve what you want with version(unittest):

version(unittest)
{
   class A { B b; }
   class B { }
}

unittest
{
   // use A and B here
}

[...]

This advice, unfortunately, needs to be tempered with caution about
namespace pollution and accidental dependency of things outside
unittests on things inside a version(unittest) block.  There's also the
issue of library code introducing extraneous import dependencies that
are really only necessary for unittesting, but get pulled in anyway
because user code happens to compile with -unittest.


This actually already happens. Any imports count, even inside unittests.

But yes, this does mean that symbols in the version(unittest) are in the 
module namespace.


You could create a struct or class namespace to avoid the pollution, as 
long as you use really horrible names that wouldn't possibly conflict.


-Steve


Do array literals still always allocate?

2017-05-13 Thread Lewis via Digitalmars-d-learn

import std.random;
import std.stdio;

int[4] testfunc(int num) @nogc
{
return [0, 1, num, 3];
}

int main()
{
int[4] arr = testfunc(uniform(0, 15));
writeln(arr);
return 0;
}

I've read a bunch of stuff that seems to indicate that array 
literals are always heap-allocated, even when being used to 
populate a static array. However, testfunc() above compiles as 
@nogc. This would indicate to me that D does the smart thing and 
avoids a heap allocation for an array literal being used to 
populate a static array. Is all the old stuff I was reading just 
out-of-date now?


Re: Do array literals still always allocate?

2017-05-13 Thread Stanislav Blinov via Digitalmars-d-learn

On Saturday, 13 May 2017 at 18:32:16 UTC, Lewis wrote:

import std.random;
import std.stdio;

int[4] testfunc(int num) @nogc
{
return [0, 1, num, 3];
}

int main()
{
int[4] arr = testfunc(uniform(0, 15));
writeln(arr);
return 0;
}

I've read a bunch of stuff that seems to indicate that array 
literals are always heap-allocated, even when being used to 
populate a static array.


On the contrary, when initializing static arrays, allocation is 
not needed.

Note that what's *conceptually* happening in testfunc is this:


int[4] testfunc(int num) @nogc
{
   typeof(return) result = [0, 1, num, 3];
   return result;
}


i.e. the type and size of the storage is known beforehand, all 
there is to do is copy the elements:


0044e528 <@nogc int[4] test.testfunc(int)>:
  44e528:   55  push   %rbp
  44e529:   48 8b ecmov%rsp,%rbp
  44e52c:   48 83 ec 10 sub$0x10,%rsp
  44e530:   48 89 7d f8 mov%rdi,-0x8(%rbp)
  44e534:   c7 07 00 00 00 00   movl   $0x0,(%rdi)  # 
0 goes at offset 0
  44e53a:   c7 47 04 01 00 00 00movl   $0x1,0x4(%rdi)   # 
1 at offset 4
  44e541:   89 77 08mov%esi,0x8(%rdi)   # 
parameter at offset 8
  44e544:   c7 47 0c 03 00 00 00movl   $0x3,0xc(%rdi)   # 
3 at offset 12

  44e54b:   48 8b 45 f8 mov-0x8(%rbp),%rax
  44e54f:   c9  leaveq
  44e550:   c3  retq


Is all the old stuff I was reading just out-of-date now?


Where exactly did you read that initialization of a static array 
requires an allocation? That source should be abolished... 
errrm... corrected!


Re: Do array literals still always allocate?

2017-05-13 Thread Steven Schveighoffer via Digitalmars-d-learn

On Saturday, 13 May 2017 at 18:32:16 UTC, Lewis wrote:

import std.random;
import std.stdio;

int[4] testfunc(int num) @nogc
{
return [0, 1, num, 3];
}

int main()
{
int[4] arr = testfunc(uniform(0, 15));
writeln(arr);
return 0;
}

I've read a bunch of stuff that seems to indicate that array 
literals are always heap-allocated, even when being used to 
populate a static array. However, testfunc() above compiles as 
@nogc. This would indicate to me that D does the smart thing 
and avoids a heap allocation for an array literal being used to 
populate a static array. Is all the old stuff I was reading 
just out-of-date now?


It's just out of date. Can't remember the version, but this did 
use to allocate. It doesn't any more. But only for this case. In 
most cases it does allocate.


-Steve



code.demangle can't demangle a type.

2017-05-13 Thread Yuxuan Shui via Digitalmars-d-learn

So in this document:

http://yshui.gitlab.io/sdpc/sdpc/parsers/whitespace.html

Part of the type name is still mangled. I found ddox use 
core.demangle.demangleType internally. So I guess code.demangle 
is following behind dmd?


Is there a better way to demangle a name?


Re: Do array literals still always allocate?

2017-05-13 Thread Nicholas Wilson via Digitalmars-d-learn

On Saturday, 13 May 2017 at 18:32:16 UTC, Lewis wrote:

import std.random;
import std.stdio;

int[4] testfunc(int num) @nogc
{
return [0, 1, num, 3];
}

int main()
{
int[4] arr = testfunc(uniform(0, 15));
writeln(arr);
return 0;
}

I've read a bunch of stuff that seems to indicate that array 
literals are always heap-allocated, even when being used to 
populate a static array. However, testfunc() above compiles as 
@nogc. This would indicate to me that D does the smart thing 
and avoids a heap allocation for an array literal being used to 
populate a static array. Is all the old stuff I was reading 
just out-of-date now?


1D arrays it doesn't, 2D or higher it does.


Re: Do array literals still always allocate?

2017-05-13 Thread Lewis via Digitalmars-d-learn
On Saturday, 13 May 2017 at 19:22:09 UTC, Steven Schveighoffer 
wrote:
It's just out of date. Can't remember the version, but this did 
use to allocate. It doesn't any more. But only for this case. 
In most cases it does allocate.


Okay cool, that's good to hear. For reference the most recent 
place I remember seeing this was 
http://stackoverflow.com/questions/6751575/how-to-initialise-static-arrays-in-d-without-a-gc-allocation (although I've definitely seen others in the past). I'll add an answer to the SO question to clarify that this is no longer an issue.


Thanks all!




Re: File Input

2017-05-13 Thread JV via Digitalmars-d-learn

On Monday, 8 May 2017 at 10:34:42 UTC, k-five wrote:

On Monday, 8 May 2017 at 10:22:53 UTC, JV wrote:

On Monday, 8 May 2017 at 09:26:48 UTC, k-five wrote:

On Monday, 8 May 2017 at 08:54:50 UTC, JV wrote:


---

If I continue to learn D I will do but there is no guarantee
and it got ready :)
https://github.com/k-five/D-By-Example

if you have git, download them:
git clone https://github.com/k-five/D-By-Example.git


Hey i'm not sure if i should create a new post for this but
how should i fix this it doesn't pause and store but just keeps 
reading


string studNum;

readf("%s",&studNum);
write(studNum);