Re: How to web programming with D2?

2011-02-10 Thread Stephan Soller

On 10.02.2011 10:29, canalpay wrote:

I am trying to write the web framework(but not to write, to gain experience.). 
Maybe the framework can has got a MVC  desing pattern. But first, the D2 is not 
has got for the web library and I am decided write to library for web.

I am writed a function for post and get methods. (I am not tried to functions. 
But I think, they are works.)
POST: https://github.com/canalpay/turna/blob/master/library/post.d
GET  :  https://github.com/canalpay/turna/blob/master/library/get.d

Environment variables are easy to write for the function.
But How to write a cookie and session?
I looked at the codes of tango. However, don't understand.(I'm new to d 
programming language.)


From your code I assume you're using CGI. To set a cookie you have to 
set the "Set-Cookie" header with a string a specific format (see 
"Cookies on Wikipedia" link). In CGI the standard output of the program 
is used as HTTP response and therefore you can set headers by printing 
them first to stdout. After you're done writing headers (one per line 
usually) output an empty line. This marks the rest of the output as 
actual content of the response. So basically your program should output 
something like this:


Content-Type: text/html
Set-Cookie: name=value


…


Depending on how you like to develop the RFCs for CGI and HTTP might 
come in handy. I sometimes also use Wikipedia to get an overview of the 
topic.


- Cookies on Wikipedia: http://en.wikipedia.org/wiki/HTTP_cookie
- HTTP on Wikipedia: http://en.wikipedia.org/wiki/Http
- CGI on Wikipedia: http://en.wikipedia.org/wiki/Common_Gateway_Interface
- CGI RFC: http://tools.ietf.org/html/rfc3875
- HTTP RFC: http://tools.ietf.org/html/rfc2616


Happy programming
Stephan Soller


Re: foreach over string enum

2011-02-10 Thread Jesse Phillips
spir Wrote:

> But in your example the symbol a does not look like a constant, instead it 
> the 
> loop variable. Do, how does it work? 

Magic.

No really, the best I can tell is that the compiler will try to run the foreach 
loop at compile-time if there is something in the body that must be evaluated 
at compile time.

The type you are iterating over must be known at compile-time, and just like 
any such value it is identified by its type and not its contents. So your array 
literal could in fact be built with a variable, the fact that it is not doesn't 
matter.

I'm not sure if much thought has gone into compile-time-looping, the best way 
to enforce it is to get a function to run at compile time. I think the rule of 
"when the body needs evaluated at compile-time" is what's used, but this also 
means that when you try to iterate something like __traits or tupleof and don't 
use a compile-time construct in the body, you don't get an error or the loop 
executed.


Re: Assert compilation failure with certain message

2011-02-10 Thread bearophile
Tomek S.:

> Static catch, yeah. But I'd be content with traits__(fails, expr, msg) which 
> seems tractable.

Asking for new features in this newsgroup is not so useful. You may add it to 
bugzilla...

Bye,
bearophile


Re: Assert compilation failure with certain message

2011-02-10 Thread Andrej Mitrovic
I've managed to screw up the colon placement though, here's a quick fix:

import std.stdio;
import std.conv;

void staticAssert(alias exp, string message, string file = __FILE__,
int line = __LINE__)()
{
static if (!exp)
{
pragma(msg, file ~ "(" ~ to!string(line) ~ "): " ~
"staticAssert: " ~  to!string(message));
assert(0);
}
}

void main()
{
enum x = false;
staticAssert!(x, "Oh no we failed!");

int y;
}


Re: Assert compilation failure with certain message

2011-02-10 Thread Andrej Mitrovic
How's this?

import std.stdio;
import std.conv;

void staticAssert(alias exp, string message, string file = __FILE__,
int line = __LINE__)()
{
static if (!exp)
{
pragma(msg, file ~ ":(" ~ to!string(line) ~ ") " ~
"staticAssert: " ~  to!string(message));
assert(0);
}
}

void main()
{
enum x = false;
staticAssert!(x, "Oh no we failed!");

int y;
}


Re: Assert compilation failure with certain message

2011-02-10 Thread Tomek Sowiński
bearophile napisał:

> > Is there a way to statically assert compilation of an expression failed 
> > *with a certain message*? I want to check
> > my static asserts trip when they should.  
> 
> I have asked something like this a lot of time ago, but I don't know a way to 
> do it. You are able to statically
> assert that some code doesn't compile, but I don't know how to assert that a 
> certain message gets produced. You are
> asking for a specific static catch :-)

Static catch, yeah. But I'd be content with traits__(fails, expr, msg) which 
seems tractable.

-- 
Tomek



Re: Assert compilation failure with certain message

2011-02-10 Thread Jonathan M Davis
On Thursday, February 10, 2011 16:12:01 Tomek Sowiński wrote:
> Is there a way to statically assert compilation of an expression failed
> *with a certain message*? I want to check my static asserts trip when they
> should.

You mean like

static assert(0, "We have a failure, Captain!");

If a static assert fails, it's obvious. Compilation fails. Now, if you're 
trying 
to assert something like that a particular template instantiation fails, the 
use 
static assert(!__traits(compiles, exp)); where exp is the expression being 
tested.

- Jonathan M Davis


Re: foreach over string enum

2011-02-10 Thread spir

On 02/11/2011 01:02 AM, Ali Çehreli wrote:

I don't have answers to your other questions.

On 02/10/2011 03:25 PM, spir wrote:


 unittest {
 auto i = 1;
 auto s = "i";


It works if you define s as:

enum s = "i";


 writeln(mixin("i")); // compiler happy up to here --> "1"
 writeln(mixin(s)); // compiler unhappy --> "Error: argument to mixin
 // must be a string, not (s)"


It now works.

Ali


Thank you, Ali.

denis
--
_
vita es estrany
spir.wikidot.com




Re: Assert compilation failure with certain message

2011-02-10 Thread bearophile
Tomek Sowiñski:

> Is there a way to statically assert compilation of an expression failed *with 
> a certain message*? I want to check my static asserts trip when they should.

I have asked something like this a lot of time ago, but I don't know a way to 
do it. You are able to statically assert that some code doesn't compile, but I 
don't know how to assert that a certain message gets produced. You are asking 
for a specific static catch :-)

Bye,
bearophile


Assert compilation failure with certain message

2011-02-10 Thread Tomek Sowiński
Is there a way to statically assert compilation of an expression failed *with a 
certain message*? I want to check my static asserts trip when they should.

-- 
Tomek


Re: foreach over string enum

2011-02-10 Thread Ali Çehreli

I don't have answers to your other questions.

On 02/10/2011 03:25 PM, spir wrote:

> unittest {
> auto i = 1;
> auto s = "i";

It works if you define s as:

enum s = "i";

> writeln(mixin("i")); // compiler happy up to here --> "1"
> writeln(mixin(s)); // compiler unhappy --> "Error: argument to mixin
> // must be a string, not (s)"

It now works.

Ali



Re: foreach over string enum

2011-02-10 Thread spir

On 02/10/2011 11:32 PM, Jesse Phillips wrote:

enum FileName : string {
>  >  file1 = "file1.ext",
>  >  file2 = "file2.ext"
>  >  }
>  >
>  >  void main(string args[])
>  >  {
>  >foreach(a; __traits(allMembers, FileName))
>  >writeln(mixin("FileName." ~ a));
>  >  }

>
>  Why the mixin? Is it (just) to have the output string computed at 
compile-time?

The value of 'a' is the enum field name, not its value.


Oops! missed this point ;-) Thanks for the explanation, Jesse.

This gave me the opportunity to ask about a detail. The following cannot 
compile because an argument to string mixin must be a (compile-time) constant:


unittest {
auto i = 1;
auto s = "i";
writeln(mixin("i"));  // compiler happy up to here --> "1"
writeln(mixin(s));  // compiler unhappy --> "Error: argument to 
mixin
// must be a string, not (s)"
}

But in your example the symbol a does not look like a constant, instead it the 
loop variable. Do, how does it work? Or is it that the compiler is able to (1) 
detect that the collection beeing traversed (__traits(allMembers, FileName)) is 
a compile-time constant (2) unroll the loop so as to rewrite it first as:

foreach(a; ["file1", "file2"])
writeln(mixin("FileName." ~ a));  // ***
and then as:
writeln(FileName.file1);
writeln(FileName.file2);

But this doesn't work, neither:
auto xx=1, yy=2;
auto as = ["x","y"];
foreach(a; as)
writeln(mixin(a ~ a));
And in fact the line *** is laso not accepted.
So, finally, I understand your code, but not how the compiler processes it so 
as to see it as a mixin with constant argument.


Denis
--
_
vita es estrany
spir.wikidot.com



Re: opIn_r not detected

2011-02-10 Thread spir

On 02/10/2011 07:43 PM, Stewart Gordon wrote:

On 10/02/2011 12:59, spir wrote:

Hello,

Implicite deref of struct pointers on member access works fine for data,
methods, even
special methods with language semantics like opEquals (see example below).
But I cannot have 'in' work with method opIn_r. I get:
Error: rvalue of in expression must be an associative array, not S*
What do I have wrong? Or is it a bug: the compiler does not even search the
struct for
opIn_r? But then, why does it do it for opEquals?



That got me thinking. It would appear that it auto-dereferences only the left
operand. Try adding this to your code and see:

writeln(s2 == sp);


Works, indeed, but using opEquals on s2, and because s2 is not "pointed".

Denis
--
_
vita es estrany
spir.wikidot.com



Re: foreach over string enum

2011-02-10 Thread Jesse Phillips
spir Wrote:

> On 02/10/2011 08:22 PM, Jesse Phillips wrote:

> > enum FileName : string {
> > file1 = "file1.ext",
> > file2 = "file2.ext"
> > }
> >
> > void main(string args[])
> > {
> >  foreach(a; __traits(allMembers, FileName))
> >  writeln(mixin("FileName." ~ a));
> > }
> 
> Why the mixin? Is it (just) to have the output string computed at 
> compile-time?

The value of 'a' is the enum field name, not its value. The code will 
ultimately expand to:

void main() {
  writeln(FileName.file1));
  writeln(FileName.file2));
}

Which in turn will may have its enum contents expanded to the string value. The 
mixin is required because it is a named enum and 'a' is a string, not an alias:

  writeln(FileName.a)

doesn't work and nor does:

writeln(FileName.mixin(a));


Re: foreach over string enum

2011-02-10 Thread spir

On 02/10/2011 08:22 PM, Jesse Phillips wrote:

Nrgyzer Wrote:


Hey guys,

I'm trying to iterate over an enumeration which contains strings like
the this:

enum FileName : string {
file1 = "file1.ext",
file2 = "file2.ext"
}

I already found this article: http://lists.puremagic.com/pipermail/
digitalmars-d/2007-July/021920.html but it's an enum which contains
integers instead of strings, thus I can't use min- or max-property.

Any suggestions ->  thanks in advance!


I'll just be leaving this here, if you need more explanation ask, but maybe 
you'll understand:

import std.stdio;

enum FileName : string {
file1 = "file1.ext",
file2 = "file2.ext"
}

void main(string args[])
{
 foreach(a; __traits(allMembers, FileName))
 writeln(mixin("FileName." ~ a));
}


Why the mixin? Is it (just) to have the output string computed at compile-time?

Denis
--
_
vita es estrany
spir.wikidot.com



Re: std.concurrency & immutable classes...

2011-02-10 Thread Steven Schveighoffer

On Thu, 10 Feb 2011 14:45:14 -0500, Tomek Sowiński  wrote:


Michel Fortin napisał:


> Thanks for doing this. Is it approved by Walter?

Depends on what you mean by "approved".

He commented once on the newsgroup after I posted an earlier version of
the patch, saying I should add tests for type deduction and some other
stuff. This change his something he attempted to do in the past and
failed, I expect him to be skeptical.


It would be much easier if he provided the specific case(s) which broke  
his teeth. Then we'll all know where's the problem. If it's soluble,  
it'll open the door to tail type modifiers in general, not just in  
classes. It's a burning issue e.g. with ranges (mostly struct).


http://d.puremagic.com/issues/show_bug.cgi?id=5377

Look at the attachment to get a feel of what hoops we'll have to jump  
through to side-step lack of tail X.


I've worked through this very same problem (a few months back), thinking  
that we need a general solution to tail-const.  The large issue with  
tail-const for structs in the general case is that you cannot control the  
type of 'this'.  It's always ref.  This might seem like a very  
inconsequential detail, but I realized that a ref to X does not implicitly  
convert to a ref to a tail-const X.  This violates a rule of two  
indirections, in which case you are not able to implicitly convert the  
indirect type, even if the indirect type would implicitly convert outside  
the reference.


A simple example, you cannot convert an int** to a const(int)**.  Reason  
being, then you could change the indirect pointer to point to something  
that's immutable, and the original int ** now points to immutable data.


The same is for tail-const structs, because you go through one ref via  
'this' and the other ref via the referring member.


What does this all mean?  It basically means that you have to define  
*separate* functions for tail-const and const, and separate functions for  
tail-immutable and immutable.  This is untenable.


You might ask "why doesn't this problem occur with tail-const arrays?",  
well because you *don't pass them by ref*.  With structs we have no choice.


I think what we need is a way to define two different structs as being the  
tail-const version of the other, with some compiler help, and then we do  
not need to define a new flavor of const functions.  We still need to  
define these "tail-const" functions, but it comes in a more understandable  
form.  But importantly, the implicit cast makes a *temporary* copy of the  
struct, allowing the cast to work.


-Steve


Re: std.concurrency & immutable classes...

2011-02-10 Thread Tomek Sowiński
Michel Fortin napisał:

> > Thanks for doing this. Is it approved by Walter?  
> 
> Depends on what you mean by "approved".
> 
> He commented once on the newsgroup after I posted an earlier version of 
> the patch, saying I should add tests for type deduction and some other 
> stuff. This change his something he attempted to do in the past and 
> failed, I expect him to be skeptical.

It would be much easier if he provided the specific case(s) which broke his 
teeth. Then we'll all know where's the problem. If it's soluble, it'll open the 
door to tail type modifiers in general, not just in classes. It's a burning 
issue e.g. with ranges (mostly struct).

http://d.puremagic.com/issues/show_bug.cgi?id=5377

Look at the attachment to get a feel of what hoops we'll have to jump through 
to side-step lack of tail X.

> I guess he'll review it when he 
> has the time and I hope he'll merge these changes in the mainline. 
> He'll probably want to take his time however, since it can break 
> existing code in some cases; it's basically a change to the language.
> 
> If you want to show your support, I guess you can vote up the 
> enhancement request in the bugzilla.
> 
> 
> Also feel free to compile it, test it, and share your experience. The 
> more tested it is, the more used and appreciated it is, the more 
> exposure it gets, the sooner it gets approved, or so I guess.

I'd love to, but I'm putting shreds of my spare time to xml.

-- 
Tomek



Re: foreach over string enum

2011-02-10 Thread Nrgyzer
== Auszug aus Jesse Phillips (jessekphillip...@gmail.com)'s Artikel
> Nrgyzer Wrote:
> > Hey guys,
> >
> > I'm trying to iterate over an enumeration which contains strings
like
> > the this:
> >
> > enum FileName : string {
> > file1 = "file1.ext",
> > file2 = "file2.ext"
> > }
> >
> > I already found this article: http://lists.puremagic.com/
pipermail/
> > digitalmars-d/2007-July/021920.html but it's an enum which
contains
> > integers instead of strings, thus I can't use min- or max-
property.
> >
> > Any suggestions -> thanks in advance!
> I'll just be leaving this here, if you need more explanation ask,
but maybe you'll understand:
> import std.stdio;
> enum FileName : string {
> file1 = "file1.ext",
> file2 = "file2.ext"
> }
> void main(string args[])
> {
> foreach(a; __traits(allMembers, FileName))
> writeln(mixin("FileName." ~ a));
> }

I've already worked with the mixin-statement, but the __trait is new.
As I can see in the documentation, it provides some interesting
features.

Your solution works great, thanks!


Re: foreach over string enum

2011-02-10 Thread Jesse Phillips
Nrgyzer Wrote:

> Hey guys,
> 
> I'm trying to iterate over an enumeration which contains strings like
> the this:
> 
> enum FileName : string {
> file1 = "file1.ext",
> file2 = "file2.ext"
> }
> 
> I already found this article: http://lists.puremagic.com/pipermail/
> digitalmars-d/2007-July/021920.html but it's an enum which contains
> integers instead of strings, thus I can't use min- or max-property.
> 
> Any suggestions -> thanks in advance!

I'll just be leaving this here, if you need more explanation ask, but maybe 
you'll understand:

import std.stdio;

enum FileName : string {
file1 = "file1.ext",
file2 = "file2.ext"
}

void main(string args[])
{
foreach(a; __traits(allMembers, FileName))
writeln(mixin("FileName." ~ a));
}



Re: Template for function or delegate (nothing else)

2011-02-10 Thread Steven Schveighoffer

On Thu, 10 Feb 2011 12:04:28 -0500, spir  wrote:


On 02/10/2011 02:51 PM, Steven Schveighoffer wrote:

On Thu, 10 Feb 2011 08:39:13 -0500, spir  wrote:


On 02/09/2011 11:05 PM, Steven Schveighoffer wrote:


I don't think you want templates. What you want is a tagged union  
(and a struct

is MUCH better suited for this):

// untested!

struct Example
{
private
{
bool isDelegate;
union
{
void function() fn;
void delegate() dg;
}
}

void setCallback(void function() f) { this.fn = f; isDelegate =  
false;}

void setCallback(void delegate() d) { this.dg = d; isDelegate = true;}

void opCall()
{
if(isDelegate)
dg();
else
fn();
}
}


Waow, very nice solution.
I really question the function/delegate distinction (mostly  
artificial, imo)
that "invents" issues necessiting workarounds like that. What does it  
mean,

what does it bring?


A function pointer is compatible with a C function pointer. C does not  
have
delegates, so if you want to do callbacks, you need to use function  
pointers.

There is no way to combine them and keep C compatibility.

Right, there is one pointer less for funcs. This save 4 or 8 bytes, so  
to
say, nothing; who develops apps with arrays of billions of funcs?  
There are

written in source ;-) Even then, if this saving of apointer was of any
relevance, then it should be an implementation detail that does not  
leak into
artificial semantic diff, creating issues on the programmer side. What  
do you

think?


What you want is already implemented. There is a relatively new phobos
construct that builds a delegate out of a function pointer. In fact, my  
code

could use it and save the tag:


// again, untested!

import std.functional : toDelegate;

struct Example
{
private void delegate() dg;

void setCallback(void function() f) { this.dg = toDelegate(f); }
void setCallback(void delegate() d) { this.dg = d; }

void opCall() { dg(); }
}

Note that toDelegate doesn't appear on the docs because of a doc  
generation bug...


Right.

I had not thought at the C-compatibility issue. So, let us say the  
func/dg distinction must remain in the language, on programmer-side,  
because of that. Then, is there anything that prevent the above cast to  
be implicit? Then, programmers would only have to define a single  
interface, using delegate everywhere; and not care about where and how  
user funcs are defined.
(because as you know presently whether a ref'ed func becomes a func  
pointer or a delegate depends on /where/ it is defined...)


Second point. I would like referencing of functions/delegates passed as  
arguments to be implicite. After all, conceptually, what we pass is a  
"function object". Not a pointer. That the implementation needs to  
"point" them is just this, implementation. The '&' just pollutes the  
code meaninglessly;


This is the way it is in C, and D purposely does not do this to avoid  
ambiguity (did you want to call the function or get it's address?).



and it's absence creates weird bugs:

void f0 ( ) { writeln(1); }
void f1 (int i) { writeln(i); }
void do0 (void function (   ) f) { f( ); }
void do1 (void function (int) f) { f(3); }

unittest {
 // Error: function __trials__.do0 (void function() f) is not  
callable

 // using argument types (void)
 do0(f0);

 // __trials__.d(46): Error: function __trials__.f1 (int i) is not  
callable

 // using argument types ()
 do1(f1);

 do0(&f0);   // ok
 do1(&f1);   // ok
}

Error messages are difficult to interpret for a diagnosis, I guess. Note  
that the first one concerns the caller, while the second one concerns  
the callee...
Implicite referencing would solve that issue /and/ match semantics /and/  
be more consistent /and/ make code nicer. About consistency, I mean that  
functions are already implicitely dereferenced: do1 does not need to  
call its arg f using

(*f)(3);
(this version works as well, indeed)


When properties are properly implemented, I expect this error message to  
be different.  Currently, it thinks you are trying to call the function f0  
and pass its result to do0.


-Steve


Re: opIn_r not detected

2011-02-10 Thread Stewart Gordon

On 10/02/2011 12:59, spir wrote:

Hello,

Implicite deref of struct pointers on member access works fine for data, 
methods, even
special methods with language semantics like opEquals (see example below).
But I cannot have 'in' work with method opIn_r. I get:
Error: rvalue of in expression must be an associative array, not S*
What do I have wrong? Or is it a bug: the compiler does not even search the 
struct for
opIn_r? But then, why does it do it for opEquals?



That got me thinking.  It would appear that it auto-dereferences only the left operand. 
Try adding this to your code and see:


writeln(s2 == sp);

Stewart.


Re: opIn_r not detected

2011-02-10 Thread spir

On 02/10/2011 02:39 PM, Steven Schveighoffer wrote:

On Thu, 10 Feb 2011 07:59:06 -0500, spir  wrote:


Hello,

Implicite deref of struct pointers on member access works fine for data,
methods, even special methods with language semantics like opEquals (see
example below).
But I cannot have 'in' work with method opIn_r. I get:
Error: rvalue of in expression must be an associative array, not S*
What do I have wrong? Or is it a bug: the compiler does not even search the
struct for opIn_r? But then, why does it do it for opEquals?

Denis

struct S {
int i;
void show() { writeln(i); }
const bool opEquals (ref const(S) s) {
writeln("==");
return (i == s.i);
}
bool opIn_r (int j) { return (i==j); }
}
unittest {
S* sp = &(S(1));
writeln(sp.i);
sp.show();
S s2 = S(1);
writeln(sp == s2);
writeln(1 in sp);
}



There is a bug in the compiler that the message says associative array is
required. There is a bugzilla issue somewhere on that...

But it does look like it should work, I'd file a separate bugzilla on the
opIn_r not working.


http://d.puremagic.com/issues/show_bug.cgi?id=5558
Content reproduced below; tell me please if the description is (not) ok.

Denis

==
Issue 5558 - opIn_r not detected as method for 'in' in pointed struct

In a struct, opIn_r is not detected by the compiler as beeing the method 
implementing the operator 'in'. Example:


struct S {
int i;
void show() { writeln(i); }
const bool opEquals (ref const(S) s) {
writeln("==");
return (i == s.i);
}
bool opIn_r (int j) { return (i==j); }
}
unittest {
S* sp = &(S(1));
writeln(sp.i);
sp.show();

S s2 = S(1);
writeln(sp == s2);
writeln(1 in s2);

// error:
writeln(1 in sp);
}
==>
Error: rvalue of in expression must be an associative array, not S*

This concerns opIn_r on pointed struct only; the other struct members of the 
structn and the not-pointed one are only here to contrast:
* Data members, regular methods and even "language methods" like opEquals are 
correctly taken into account on a struct, even via implicite deref.
* opIn_r is correctly detected as implementing 'in' on a non-pointed or 
explicitely dereferenced struct.


Thus, the code works fine if one comments out the very last line.

Waiting for a fix, the error message should be corrected to eg:
Error: right operand of 'in' operation must be an associative array
   or implement the operator 'in' via method opIn_r

--
_
vita es estrany
spir.wikidot.com



Re: Template for function or delegate (nothing else)

2011-02-10 Thread spir

On 02/10/2011 02:51 PM, Steven Schveighoffer wrote:

On Thu, 10 Feb 2011 08:39:13 -0500, spir  wrote:


On 02/09/2011 11:05 PM, Steven Schveighoffer wrote:



I don't think you want templates. What you want is a tagged union (and a struct
is MUCH better suited for this):

// untested!

struct Example
{
private
{
bool isDelegate;
union
{
void function() fn;
void delegate() dg;
}
}

void setCallback(void function() f) { this.fn = f; isDelegate = false;}
void setCallback(void delegate() d) { this.dg = d; isDelegate = true;}

void opCall()
{
if(isDelegate)
dg();
else
fn();
}
}


Waow, very nice solution.
I really question the function/delegate distinction (mostly artificial, imo)
that "invents" issues necessiting workarounds like that. What does it mean,
what does it bring?


A function pointer is compatible with a C function pointer. C does not have
delegates, so if you want to do callbacks, you need to use function pointers.
There is no way to combine them and keep C compatibility.


Right, there is one pointer less for funcs. This save 4 or 8 bytes, so to
say, nothing; who develops apps with arrays of billions of funcs? There are
written in source ;-) Even then, if this saving of apointer was of any
relevance, then it should be an implementation detail that does not leak into
artificial semantic diff, creating issues on the programmer side. What do you
think?


What you want is already implemented. There is a relatively new phobos
construct that builds a delegate out of a function pointer. In fact, my code
could use it and save the tag:


// again, untested!

import std.functional : toDelegate;

struct Example
{
private void delegate() dg;

void setCallback(void function() f) { this.dg = toDelegate(f); }
void setCallback(void delegate() d) { this.dg = d; }

void opCall() { dg(); }
}

Note that toDelegate doesn't appear on the docs because of a doc generation 
bug...


Right.

I had not thought at the C-compatibility issue. So, let us say the func/dg 
distinction must remain in the language, on programmer-side, because of that. 
Then, is there anything that prevent the above cast to be implicit? Then, 
programmers would only have to define a single interface, using delegate 
everywhere; and not care about where and how user funcs are defined.
(because as you know presently whether a ref'ed func becomes a func pointer or 
a delegate depends on /where/ it is defined...)


Second point. I would like referencing of functions/delegates passed as 
arguments to be implicite. After all, conceptually, what we pass is a "function 
object". Not a pointer. That the implementation needs to "point" them is just 
this, implementation. The '&' just pollutes the code meaninglessly; and it's 
absence creates weird bugs:


void f0 ( ) { writeln(1); }
void f1 (int i) { writeln(i); }
void do0 (void function (   ) f) { f( ); }
void do1 (void function (int) f) { f(3); }

unittest {
// Error: function __trials__.do0 (void function() f) is not callable
// using argument types (void)
do0(f0);

// __trials__.d(46): Error: function __trials__.f1 (int i) is not callable
// using argument types ()
do1(f1);

do0(&f0);   // ok
do1(&f1);   // ok
}

Error messages are difficult to interpret for a diagnosis, I guess. Note that 
the first one concerns the caller, while the second one concerns the callee...
Implicite referencing would solve that issue /and/ match semantics /and/ be 
more consistent /and/ make code nicer. About consistency, I mean that functions 
are already implicitely dereferenced: do1 does not need to call its arg f using

(*f)(3);
(this version works as well, indeed)

denis
--
_
vita es estrany
spir.wikidot.com



foreach over string enum

2011-02-10 Thread Nrgyzer
Hey guys,

I'm trying to iterate over an enumeration which contains strings like
the this:

enum FileName : string {
file1 = "file1.ext",
file2 = "file2.ext"
}

I already found this article: http://lists.puremagic.com/pipermail/
digitalmars-d/2007-July/021920.html but it's an enum which contains
integers instead of strings, thus I can't use min- or max-property.

Any suggestions -> thanks in advance!


Re: Dynamic and Static Casting

2011-02-10 Thread Steven Schveighoffer

On Thu, 10 Feb 2011 11:38:40 -0500, spir  wrote:


On 02/10/2011 01:38 PM, bearophile wrote:





Is a pair of similar staticDownCast(), staticUpCast() fit for Phobos?


But I have never needed upcast in D as of now. What are common use cases?


Aren't all upcasts static anyways?

-Steve


Re: MD5 hash on a file and rawRead

2011-02-10 Thread Andrej Mitrovic
On 2/10/11, Lars T. Kyllingstad  wrote:
>
> To read an entire file at once, you should use std.file.read(), or
> std.file.readText() if it's an UTF encoded text file.

I missed that method while browsing through the docs. Thanks.

>
> There are actually three modules for file handling, but I think they are
> nicely separated:
>
>   - std.file handles files as isolated units, i.e. it reads,
> writes and manipulates entire files.
>
>   - std.path manipulates file/directory names as strings, and
> performs no disk I/O.
>
>   - std.stdio is for more advanced file I/O, as it lets you
> open files and manipulate them through the File handle.
> (This includes reading, writing, seeking, etc.)
>
> Hope this clears things up. :)
>
> -Lars
>

Yeah I know there's 3 modules, I'd still prefer having one module for
file manipulation and one for the path string functionality. Right now
I have to keep switching between stdio and file's documentation all
the time, which is how I've managed to miss the .read method. Thanks
again though.


Re: Dynamic and Static Casting

2011-02-10 Thread spir

On 02/10/2011 01:38 PM, bearophile wrote:

Lars T. Kyllingstad:


Ok, bearophile's solution is better, because it has fewer casts.


And your solution was better because it's inside a function :-)



I forgot you can cast to void*.  So here's an improved version, with some
template constraints to make sure it's only used for class types:

 T staticCast(T, U)(U obj)  if (is(T == class)&&  is(U == class))
 {
 return cast(T) cast(void*) obj;
 }



And what about:

import std.stdio, std.traits, std.typetuple;

/// C++ static_cast for just down-casting
T staticDownCast(T, F)(F from) if (is(F == class)&&
is(T == class)&&
staticIndexOf!(F, BaseClassesTuple!T) != -1)
 in {
 assert((from is null) || cast(T)from !is null);
 } body {
 return cast(T)cast(void*)from;
 }

class Foo {}
class Bar : Foo {}
class Spam {}

Bar test1() {
 Foo f = new Foo;
 Bar b = cast(Bar)f;
 return b;
}

Bar test2() {
 Foo f = new Foo;
 Bar b = staticDownCast!Bar(f);
 return b;
}

void main() {
 Spam s = new Spam;
 Bar b = staticDownCast!Bar(s); // error
}

/*
_D4test5test1FZC4test3Bar   comdat
L0: pushEAX
 mov EAX,offset FLAT:_D4test3Bar7__ClassZ
 mov ECX,offset FLAT:_D4test3Foo7__ClassZ
 pushEAX
 pushECX
 callnear ptr __d_newclass
 add ESP,4
 pushEAX
 callnear ptr __d_dynamic_cast
 add ESP,8
 pop ECX
 ret

_D4test5test2FZC4test3Bar   comdat
L0: pushEAX
 mov EAX,offset FLAT:_D4test3Foo7__ClassZ
 pushEAX
 callnear ptr __d_newclass
 add ESP,4
 pop ECX
 ret
*/


Is a pair of similar staticDownCast(), staticUpCast() fit for Phobos?


I think so. Definitely need staticDownCast very often for all functionality in 
type-hierarchy-generic code where some arguments are known to be of a given 
subtype.
Typically, some func produces a collection of a given supertype (say, Node). It 
may be stored on a member, or produced on need. Some other func takes such a 
collection as input; but using this func means we know all or some of the 
objects are of a given subtype (say AssignmentNode); and indeed, we need the 
additional members of the subtype.
Other case, each Node holds one or more other nodes. In the general case, they 
can be of any subtype. But when a func takes an AssignmentNode, then it knows 
its subnodes must be NameNode and ExpressionNode, hey!, ain't it clever? And 
indeed it'll need to access members specific to their subtypes.


But I have never needed upcast in D as of now. What are common use cases?

Denis
--
_
vita es estrany
spir.wikidot.com



Re: Template for function or delegate (nothing else)

2011-02-10 Thread useo
== Auszug aus Steven Schveighoffer (schvei...@yahoo.com)'s Artikel
> On Thu, 10 Feb 2011 09:48:14 -0500, useo  wrote:
> > I created a complete, new file with the following code:
> >
> > module example;
> >
> > void main(string[] args) {
> > Example!(void function()) myVar;
> > }
> >
> > class Example(T) if (is(T == delegate) || is(T == function)) {
> > }
> >
> > And what I get is:
> >
> > example.d(4): Error: template instance Example!(void function())
does
> > not match template declaration Example(T) if (is(T == delegate)
|| is
> > (T == function))
> > example.d(4): Error: Example!(void function()) is used as a type
> >
> > I'm using the current stable version 2.051.
> Found this invalid bug.  Apparently, this is expected (!) behavior:
> http://d.puremagic.com/issues/show_bug.cgi?id=3464
> So use this instead:
> class Example(T) if (is(T == delegate) || is(typeof(*T.init) ==
function))
> Ugly, I know, but I guess that's what we got to work with.
> -Steve

Yes, looks a bit unusual but it works, thanks!


Re: Template for function or delegate (nothing else)

2011-02-10 Thread Steven Schveighoffer

On Thu, 10 Feb 2011 09:48:14 -0500, useo  wrote:



I created a complete, new file with the following code:

module example;

void main(string[] args) {
Example!(void function()) myVar;
}

class Example(T) if (is(T == delegate) || is(T == function)) {
}

And what I get is:

example.d(4): Error: template instance Example!(void function()) does
not match template declaration Example(T) if (is(T == delegate) || is
(T == function))
example.d(4): Error: Example!(void function()) is used as a type

I'm using the current stable version 2.051.


Found this invalid bug.  Apparently, this is expected (!) behavior:

http://d.puremagic.com/issues/show_bug.cgi?id=3464

So use this instead:

class Example(T) if (is(T == delegate) || is(typeof(*T.init) == function))

Ugly, I know, but I guess that's what we got to work with.

-Steve


Re: Template for function or delegate (nothing else)

2011-02-10 Thread useo
== Auszug aus useo (u...@start.bg)'s Artikel
> == Auszug aus Steven Schveighoffer (schvei...@yahoo.com)'s Artikel
> > On Thu, 10 Feb 2011 09:09:03 -0500, useo  wrote:
> > > I implemented all I wanted and it works perfectly ;).
> > >
> > > But I'm using the "if (is(T == delegate) || is(T == function))"-
> > > statement in another class/template.
> > >
> > > class Example(T) if (is(T == delegate) || is(T == function)) {
> > > ...
> > > }
> > >
> > > Now, when I declare Example!(void function()) myVar; I always
get:
> > >
> > > Error: template instance Example!(void function()) does not
match
> > > template declaration Example(T) if (is(T == delegate) || is(T ==
> > > function))
> > > Error: Example!(void function()) is used as a type
> > >
> > > When I declare myVar as Example!(function), I get some other
> errors.
> > >
> > > What's wrong with my code?
> > Please post a full example that creates the error.  From that
error
> > message, it appears that your code is correct, but I'd have to
play
> with a
> > real example to be sure.
> > -Steve
> I created a complete, new file with the following code:
> module example;
> void main(string[] args) {
>   Example!(void function()) myVar;
> }
> class Example(T) if (is(T == delegate) || is(T == function)) {
> }
> And what I get is:
> example.d(4): Error: template instance Example!(void function())
does
> not match template declaration Example(T) if (is(T == delegate) ||
is
> (T == function))
> example.d(4): Error: Example!(void function()) is used as a type
> I'm using the current stable version 2.051.

I noticed, that this error only occurs when I use function as
template-type. When I use Example!(void delegate()) myVar; it
compiles without any error. With function - Example!(void function())
myVar; I get the error(s) above.


Re: Template for function or delegate (nothing else)

2011-02-10 Thread useo
== Auszug aus Steven Schveighoffer (schvei...@yahoo.com)'s Artikel
> On Thu, 10 Feb 2011 09:09:03 -0500, useo  wrote:
> > I implemented all I wanted and it works perfectly ;).
> >
> > But I'm using the "if (is(T == delegate) || is(T == function))"-
> > statement in another class/template.
> >
> > class Example(T) if (is(T == delegate) || is(T == function)) {
> > ...
> > }
> >
> > Now, when I declare Example!(void function()) myVar; I always get:
> >
> > Error: template instance Example!(void function()) does not match
> > template declaration Example(T) if (is(T == delegate) || is(T ==
> > function))
> > Error: Example!(void function()) is used as a type
> >
> > When I declare myVar as Example!(function), I get some other
errors.
> >
> > What's wrong with my code?
> Please post a full example that creates the error.  From that error
> message, it appears that your code is correct, but I'd have to play
with a
> real example to be sure.
> -Steve

I created a complete, new file with the following code:

module example;

void main(string[] args) {
Example!(void function()) myVar;
}

class Example(T) if (is(T == delegate) || is(T == function)) {
}

And what I get is:

example.d(4): Error: template instance Example!(void function()) does
not match template declaration Example(T) if (is(T == delegate) || is
(T == function))
example.d(4): Error: Example!(void function()) is used as a type

I'm using the current stable version 2.051.


Re: Template for function or delegate (nothing else)

2011-02-10 Thread Steven Schveighoffer

On Thu, 10 Feb 2011 09:09:03 -0500, useo  wrote:


I implemented all I wanted and it works perfectly ;).

But I'm using the "if (is(T == delegate) || is(T == function))"-
statement in another class/template.

class Example(T) if (is(T == delegate) || is(T == function)) {
...
}

Now, when I declare Example!(void function()) myVar; I always get:

Error: template instance Example!(void function()) does not match
template declaration Example(T) if (is(T == delegate) || is(T ==
function))
Error: Example!(void function()) is used as a type

When I declare myVar as Example!(function), I get some other errors.

What's wrong with my code?


Please post a full example that creates the error.  From that error  
message, it appears that your code is correct, but I'd have to play with a  
real example to be sure.


-Steve


Re: Template for function or delegate (nothing else)

2011-02-10 Thread useo
I implemented all I wanted and it works perfectly ;).

But I'm using the "if (is(T == delegate) || is(T == function))"-
statement in another class/template.

class Example(T) if (is(T == delegate) || is(T == function)) {
...
}

Now, when I declare Example!(void function()) myVar; I always get:

Error: template instance Example!(void function()) does not match
template declaration Example(T) if (is(T == delegate) || is(T ==
function))
Error: Example!(void function()) is used as a type

When I declare myVar as Example!(function), I get some other errors.

What's wrong with my code?


Re: Invoke garbage collector?

2011-02-10 Thread Johannes Pfau
Sean Eskapp wrote:
>I'm having an unfortunate DSFML issue, where failing to free objects
>like Images or Sprites causes exceptions to eventually be thrown.
>Calling the built-in member dispose() causes access violations, so I
>assume it's not for programmer use.
>
>However, I need the resources to be freed more quickly than the GC is
>apparently doing (I assume the Images and Sprites are eventually
>cleaned up), so is there a way to invoke a GC cleanup in some way?

I don't think that invoking the garbage collector is a good solution in
this case. "dispose" is indeed defined as "protected", so you probably
should not call it manually, but then there really should be a public
dispose like function. The reason for the crashes when calling
dispose manually is simple: dispose calls a c sfml function to release c
resources. The destructor calls dispose again, dispose tries to free an
invalid pointer -> crash. So what should probably be done is to define a
private m_disposed member and only call dispose if it hasn't been called
before. Try to add this code to the DSFMLObject class in
dsfml/system/common.d:

-
private:
bool m_disposed = false;

public:
final void releaseRessources() //Needs a better name, though
{
if(m_disposed)
return;
dispose();
m_disposed = true;
}
-

And change dispose() in the DSFmLObject ~this() to releaseRessources();

(Crashes might still occur if dispose is called directly. In the end,
this might need a little more thinking, but that's up to the DSFML
authors ;-))
-- 
Johannes Pfau


signature.asc
Description: PGP signature


Re: Invoke garbage collector?

2011-02-10 Thread Johannes Pfau
Johannes Pfau wrote:
>Sean Eskapp wrote:
>>I'm having an unfortunate DSFML issue, where failing to free objects
>>like Images or Sprites causes exceptions to eventually be thrown.
>>Calling the built-in member dispose() causes access violations, so I
>>assume it's not for programmer use.
>>
>>However, I need the resources to be freed more quickly than the GC is
>>apparently doing (I assume the Images and Sprites are eventually
>>cleaned up), so is there a way to invoke a GC cleanup in some way?
>
>I don't think that invoking the garbage collector is a good solution in
>this case. "dispose" is indeed defined as "protected", so you probably
>should not call it manually, but then there really should be a public
>dispose like function. The reason for the crashes when calling
>dispose manually is simple: dispose calls a c sfml function to release
>c resources. The destructor calls dispose again, dispose tries to free
>an invalid pointer -> crash. So what should probably be done is to
>define a private m_disposed member and only call dispose if it hasn't
>been called before. Try to add this code to the DSFMLObject class in
>dsfml/system/common.d:
>
>-
>private:
>bool m_disposed = false;
>
>public:
>final void releaseRessources() //Needs a better name, though
>{
>if(m_disposed || m_preventDelete)
>return;
>dispose();
>m_disposed = true;
>}
>-
>
>And change dispose() in the DSFmLObject ~this() to releaseRessources();
>
>(Crashes might still occur if dispose is called directly. In the end,
>this might need a little more thinking, but that's up to the DSFML
>authors ;-))

The releaseRessources function should also check for m_preventDelete.
Updated in the quote above.
-- 
Johannes Pfau


signature.asc
Description: PGP signature


Re: Template for function or delegate (nothing else)

2011-02-10 Thread Steven Schveighoffer

On Thu, 10 Feb 2011 08:39:13 -0500, spir  wrote:


On 02/09/2011 11:05 PM, Steven Schveighoffer wrote:


I don't think you want templates. What you want is a tagged union (and  
a struct

is MUCH better suited for this):

// untested!

struct Example
{
private
{
bool isDelegate;
union
{
void function() fn;
void delegate() dg;
}
}

void setCallback(void function() f) { this.fn = f; isDelegate = false;}
void setCallback(void delegate() d) { this.dg = d; isDelegate = true;}

void opCall()
{
if(isDelegate)
dg();
else
fn();
}
}


Waow, very nice solution.
I really question the function/delegate distinction (mostly artificial,  
imo) that "invents" issues necessiting workarounds like that. What does  
it mean, what does it bring?


A function pointer is compatible with a C function pointer.  C does not  
have delegates, so if you want to do callbacks, you need to use function  
pointers.  There is no way to combine them and keep C compatibility.


Right, there is one pointer less for funcs. This save 4 or 8 bytes, so  
to say, nothing; who develops apps with arrays of billions of funcs?  
There are written in source ;-) Even then, if this saving of apointer  
was of any relevance, then it should be an implementation detail that  
does not leak into artificial semantic diff, creating issues on the  
programmer side. What do you think?


What you want is already implemented.  There is a relatively new phobos  
construct that builds a delegate out of a function pointer.  In fact, my  
code could use it and save the tag:



// again, untested!

import std.functional : toDelegate;

struct Example
{
   private void delegate() dg;

   void setCallback(void function() f) { this.dg = toDelegate(f); }
   void setCallback(void delegate() d) { this.dg = d; }

   void opCall() { dg(); }
}

Note that toDelegate doesn't appear on the docs because of a doc  
generation bug...


-Steve


Re: opIn_r not detected

2011-02-10 Thread Steven Schveighoffer

On Thu, 10 Feb 2011 07:59:06 -0500, spir  wrote:


Hello,

Implicite deref of struct pointers on member access works fine for data,  
methods, even special methods with language semantics like opEquals (see  
example below).

But I cannot have 'in' work with method opIn_r. I get:
 Error: rvalue of in expression must be an associative array, not S*
What do I have wrong? Or is it a bug: the compiler does not even search  
the struct for opIn_r? But then, why does it do it for opEquals?


Denis

struct S {
 int i;
 void show() { writeln(i); }
 const bool opEquals (ref const(S) s) {
 writeln("==");
 return (i == s.i);
 }
 bool opIn_r (int j) { return (i==j); }
}
unittest {
 S* sp = &(S(1));
 writeln(sp.i);
 sp.show();
 S s2 = S(1);
 writeln(sp == s2);
 writeln(1 in sp);
}



There is a bug in the compiler that the message says associative array is  
required.  There is a bugzilla issue somewhere on that...


But it does look like it should work, I'd file a separate bugzilla on the  
opIn_r not working.


-Steve


Re: Template for function or delegate (nothing else)

2011-02-10 Thread spir

On 02/09/2011 11:05 PM, Steven Schveighoffer wrote:

On Wed, 09 Feb 2011 16:41:25 -0500, useo  wrote:


== Auszug aus bearophile (bearophileh...@lycos.com)'s Artikel

useo:
> I just have a problem with my variables.
>
> For example... my class/template just looks like:
>
> class Example(T) if (is(T == delegate) || is(T == function))
> {
> T callback;
>
> void setCallback(T cb) {
> callback = cb;
> }
>
> }
>
> This means that I need variables like Example!(void function

())

> myVariable. But is there any possibility to use variables like
> Example myVariable?
D is not the SML language, templates are just placeholders. If

you don't instantiate a template, you have only a symbol. Example
is only assignable to an alias (and in past, to a typedef):

alias Example Foo;
> The template declaration only defines the type of
> a callback and perhaps one method-declaration nothing else. I

already

> tried Example!(void*) because delegates and functions are void
> pointers but I always get an error. I hope there is any way

to do

> this.
I don't yet understand what you are trying to do.
Other notes:
- What if your T is a functor (a callable class/struct/union

instance that defined opCall)?

- sizeof of a function pointer is 1 CPU word, while a delegate

is 2 CPU words (and a delegate clojure has stuff on the heap too,
sometimes).

Bye,
bearophile


Idea is the following:

class Example(T) if (is(T == delegate) || is(T == function)) {

T callback;

void setCallback(T cb) {
callback = cb;
}

void opCall() {
callback();
}

}

other file:

import example;

private {

Example variable;

}

void setExampleVariable(Example ex) {
variable = ex;
}

void callCurrentExampleVariable() {
variable();
}


I don't think you want templates. What you want is a tagged union (and a struct
is MUCH better suited for this):

// untested!

struct Example
{
private
{
bool isDelegate;
union
{
void function() fn;
void delegate() dg;
}
}

void setCallback(void function() f) { this.fn = f; isDelegate = false;}
void setCallback(void delegate() d) { this.dg = d; isDelegate = true;}

void opCall()
{
if(isDelegate)
dg();
else
fn();
}
}


Waow, very nice solution.
I really question the function/delegate distinction (mostly artificial, imo) 
that "invents" issues necessiting workarounds like that. What does it mean, 
what does it bring?
Right, there is one pointer less for funcs. This save 4 or 8 bytes, so to say, 
nothing; who develops apps with arrays of billions of funcs? There are written 
in source ;-) Even then, if this saving of apointer was of any relevance, then 
it should be an implementation detail that does not leak into artificial 
semantic diff, creating issues on the programmer side. What do you think?


Denis
--
_
vita es estrany
spir.wikidot.com



Re: Dynamic and Static Casting

2011-02-10 Thread Steven Schveighoffer

On Thu, 10 Feb 2011 08:02:08 -0500, d coder  wrote:


Thanks Lars and Bearophile, I will give it a try.

I understand that static downcasting is dangerous. But there are
places where efficiency is paramount and you are sure that the casting
is safe. So I wholeheartedly second your proposal to have the stuff in
phobos.


Be aware that blindly casting interfaces is not a good idea.  An interface  
pointer is offset into the object and the cast *must* be dynamic.


Casting objects from one class to another should be reliable, however.

-Steve


Re: Invoke garbage collector?

2011-02-10 Thread Steven Schveighoffer

On Thu, 10 Feb 2011 07:34:53 -0500, spir  wrote:


On 02/09/2011 10:15 PM, Steven Schveighoffer wrote:
On Wed, 09 Feb 2011 15:58:13 -0500, bearophile  
 wrote:



Sean Eskapp:


so is there a way to invoke a GC cleanup in some way?


http://www.digitalmars.com/d/2.0/phobos/core_memory.html#minimize


This attempts to minimize memory, it does not run a collection cycle (I  
don't

think anyways). To invoke the GC collector, use:

http://www.digitalmars.com/d/2.0/phobos/core_memory.html#collect

-Steve


But won't this blindly run a GC cycle? What if all I want is a given  
thingy's mem to be released, isn't it overkill to call GC.collect?


Then you can free it via:  
http://www.digitalmars.com/d/2.0/phobos/core_memory.html#free


The OP's question was "how do I run the garbage collector".

-Steve


Re: Dynamic and Static Casting

2011-02-10 Thread d coder
Thanks Lars and Bearophile, I will give it a try.

I understand that static downcasting is dangerous. But there are
places where efficiency is paramount and you are sure that the casting
is safe. So I wholeheartedly second your proposal to have the stuff in
phobos.

Regards
- Cherry


opIn_r not detected

2011-02-10 Thread spir

Hello,

Implicite deref of struct pointers on member access works fine for data, 
methods, even special methods with language semantics like opEquals (see 
example below).

But I cannot have 'in' work with method opIn_r. I get:
Error: rvalue of in expression must be an associative array, not S*
What do I have wrong? Or is it a bug: the compiler does not even search the 
struct for opIn_r? But then, why does it do it for opEquals?


Denis

struct S {
int i;
void show() { writeln(i); }
const bool opEquals (ref const(S) s) {
writeln("==");
return (i == s.i);
}
bool opIn_r (int j) { return (i==j); }
}
unittest {
S* sp = &(S(1));
writeln(sp.i);
sp.show();
S s2 = S(1);
writeln(sp == s2);
writeln(1 in sp);
}

--
_
vita es estrany
spir.wikidot.com



Re: Dynamic and Static Casting

2011-02-10 Thread bearophile
Lars T. Kyllingstad:

> Ok, bearophile's solution is better, because it has fewer casts.

And your solution was better because it's inside a function :-)


> I forgot you can cast to void*.  So here's an improved version, with some 
> template constraints to make sure it's only used for class types:
> 
> T staticCast(T, U)(U obj)  if (is(T == class) && is(U == class))
> {
> return cast(T) cast(void*) obj;
> }


And what about:

import std.stdio, std.traits, std.typetuple;

/// C++ static_cast for just down-casting
T staticDownCast(T, F)(F from) if (is(F == class) &&
   is(T == class) &&
   staticIndexOf!(F, BaseClassesTuple!T) != -1)
in {
assert((from is null) || cast(T)from !is null);
} body {
return cast(T)cast(void*)from;
}

class Foo {}
class Bar : Foo {}
class Spam {}

Bar test1() {
Foo f = new Foo;
Bar b = cast(Bar)f;
return b;
}

Bar test2() {
Foo f = new Foo;
Bar b = staticDownCast!Bar(f);
return b;
}

void main() {
Spam s = new Spam;
Bar b = staticDownCast!Bar(s); // error
}

/*
_D4test5test1FZC4test3Bar   comdat
L0: pushEAX
mov EAX,offset FLAT:_D4test3Bar7__ClassZ
mov ECX,offset FLAT:_D4test3Foo7__ClassZ
pushEAX
pushECX
callnear ptr __d_newclass
add ESP,4
pushEAX
callnear ptr __d_dynamic_cast
add ESP,8
pop ECX
ret

_D4test5test2FZC4test3Bar   comdat
L0: pushEAX
mov EAX,offset FLAT:_D4test3Foo7__ClassZ
pushEAX
callnear ptr __d_newclass
add ESP,4
pop ECX
ret
*/


Is a pair of similar staticDownCast(), staticUpCast() fit for Phobos?

Bye,
bearophile


Re: Invoke garbage collector?

2011-02-10 Thread spir

On 02/09/2011 10:15 PM, Steven Schveighoffer wrote:

On Wed, 09 Feb 2011 15:58:13 -0500, bearophile  wrote:


Sean Eskapp:


so is there a way to invoke a GC cleanup in some way?


http://www.digitalmars.com/d/2.0/phobos/core_memory.html#minimize


This attempts to minimize memory, it does not run a collection cycle (I don't
think anyways). To invoke the GC collector, use:

http://www.digitalmars.com/d/2.0/phobos/core_memory.html#collect

-Steve


But won't this blindly run a GC cycle? What if all I want is a given thingy's 
mem to be released, isn't it overkill to call GC.collect?


Denis
--
_
vita es estrany
spir.wikidot.com



Re: Dynamic and Static Casting

2011-02-10 Thread Lars T. Kyllingstad
On Thu, 10 Feb 2011 11:54:02 +, Lars T. Kyllingstad wrote:

> On Thu, 10 Feb 2011 16:44:12 +0530, d coder wrote:
> 
>> Greetings All
>> 
>> I have learnt that D has only one casting operator and that is 'cast'.
>> The same operator assumes different functionality depending on the
>> context in which it he being used.
>> 
>> Now I have a situation where I have to downcast an object and I am sure
>> of the objects type and thereby I am sure that the downcast would only
>> be successful. To make the operation faster, in C++ I could have used
>> static_cast operator, thus giving the RTTI a skip. Would this be
>> possible in D? Can I force a static_cast which downcasting?
> 
> Here's one solution.  [...]

Ok, bearophile's solution is better, because it has fewer casts.  I 
forgot you can cast to void*.  So here's an improved version, with some 
template constraints to make sure it's only used for class types:

T staticCast(T, U)(U obj)  if (is(T == class) && is(U == class))
{
return cast(T) cast(void*) obj;
}

-Lars


Re: Dynamic and Static Casting

2011-02-10 Thread bearophile
d coder:

> I have learnt that D has only one casting operator and that is 'cast'.
> The same operator assumes different functionality depending on the
> context in which it he being used.

Walter likes this design, I presume he thinks it's simpler.


> Now I have a situation where I have to downcast an object and I am
> sure of the objects type and thereby I am sure that the downcast would
> only be successful. To make the operation faster, in C++ I could have
> used static_cast operator, thus giving the RTTI a skip. Would this be
> possible in D? Can I force a static_cast which downcasting?

There is no direct support for it because it's considered bad, so this is 
usually not done in D, it's for special situations only:


class Foo {}
class Bar : Foo {}
Bar test1() {
Foo f = new Foo;
Bar b = cast(Bar)f;
return b;
}
Bar test2() {
Foo f = new Foo;
Bar b = cast(Bar)cast(void*)f;
return b;
}
void main() {}


DMD 2.051, -O -release -inline:

_D4test5test1FZC4test3Bar   comdat
L0: pushEAX
mov EAX,offset FLAT:_D4test3Bar7__ClassZ
mov ECX,offset FLAT:_D4test3Foo7__ClassZ
pushEAX
pushECX
callnear ptr __d_newclass
add ESP,4
pushEAX
callnear ptr __d_dynamic_cast
add ESP,8
pop ECX
ret

_D4test5test2FZC4test3Bar   comdat
L0: pushEAX
mov EAX,offset FLAT:_D4test3Foo7__ClassZ
pushEAX
callnear ptr __d_newclass
add ESP,4
pop ECX
ret

Bye,
bearophile


Re: Dynamic and Static Casting

2011-02-10 Thread Lars T. Kyllingstad
On Thu, 10 Feb 2011 16:44:12 +0530, d coder wrote:

> Greetings All
> 
> I have learnt that D has only one casting operator and that is 'cast'.
> The same operator assumes different functionality depending on the
> context in which it he being used.
> 
> Now I have a situation where I have to downcast an object and I am sure
> of the objects type and thereby I am sure that the downcast would only
> be successful. To make the operation faster, in C++ I could have used
> static_cast operator, thus giving the RTTI a skip. Would this be
> possible in D? Can I force a static_cast which downcasting?

Here's one solution.  I am not 100% sure of the validity of this, so 
until someone else vouches for it, it should be considered evil.  It 
works by first casting the reference to a pointer, then to a different 
pointer type (which goes unchecked), and then to a reference again.

// Evil hack to emulate static_cast
T staticCast(T, F)(F from)
{
return cast(T) cast(T*) cast(F*) from;
}

Example usage:

class A { int i; }
class B : A { int j; }

void main()
{
auto b = new B;
b.i = 123;

auto a = staticCast!A(b);
assert (a.i == 123);
}

-Lars


Dynamic and Static Casting

2011-02-10 Thread d coder
Greetings All

I have learnt that D has only one casting operator and that is 'cast'.
The same operator assumes different functionality depending on the
context in which it he being used.

Now I have a situation where I have to downcast an object and I am
sure of the objects type and thereby I am sure that the downcast would
only be successful. To make the operation faster, in C++ I could have
used static_cast operator, thus giving the RTTI a skip. Would this be
possible in D? Can I force a static_cast which downcasting?

Regards
- Cherry


Re: How to web programming with D2?

2011-02-10 Thread Lars T. Kyllingstad
On Thu, 10 Feb 2011 04:29:21 -0500, canalpay wrote:

> I am trying to write the web framework(but not to write, to gain
> experience.). Maybe the framework can has got a MVC  desing pattern. But
> first, the D2 is not has got for the web library and I am decided write
> to library for web.
> 
> I am writed a function for post and get methods. (I am not tried to
> functions. But I think, they are works.) POST:
> https://github.com/canalpay/turna/blob/master/library/post.d GET  : 
> https://github.com/canalpay/turna/blob/master/library/get.d
> 
> Environment variables are easy to write for the function. But How to
> write a cookie and session? I looked at the codes of tango. However,
> don't understand.(I'm new to d programming language.)

Adam D. Ruppe does a lot of web development in D, and he has created a 
fairly extensive web-dev library.

  http://arsdnet.net/dcode/

For cookie/session handling, cgi.d is probably the place to look.

-Lars


How to web programming with D2?

2011-02-10 Thread canalpay
I am trying to write the web framework(but not to write, to gain experience.). 
Maybe the framework can has got a MVC  desing pattern. But first, the D2 is not 
has got for the web library and I am decided write to library for web.

I am writed a function for post and get methods. (I am not tried to functions. 
But I think, they are works.)
POST: https://github.com/canalpay/turna/blob/master/library/post.d
GET  :  https://github.com/canalpay/turna/blob/master/library/get.d

Environment variables are easy to write for the function.
But How to write a cookie and session?
I looked at the codes of tango. However, don't understand.(I'm new to d 
programming language.)


Re: MD5 hash on a file and rawRead

2011-02-10 Thread Lars T. Kyllingstad
On Wed, 09 Feb 2011 23:01:47 -0500, Andrej Mitrovic wrote:

> I'm trying to use the std.md5.sum method. It takes as an argument a
> digest to output the hash to, and the second argument is plain data.
> 
> So I'm trying to read an entire file at once. I thought about using
> rawRead, but I get a runtime exception:
> auto filename = r"C:\file.dat";
> File file;
> try
> {
> file = File(filename, "r");
> }
> catch (ErrnoException exc)
> {
> return;
> }
> ubyte[] buffer;
> file.rawRead(buffer);
>  
> error: stdio.d:rawRead must take a non-empty buffer
> 
> There are no size methods for the File structure (why?). There's a
> getSize function but it's in std.file, and I can't use it because:
> 
> auto filename = r"C:\file.dat";
> File file;
> try
> {
> file = File(filename, "r");
> }
> catch (ErrnoException exc)
> {
> return;
> }
> 
> ubyte[] buffer = new ubyte[](getSize(filename)); ubyte[16]
> digest;
> file.rawRead(buffer);
> std.md5.sum(digest, buffer);
> 
> Error: cannot implicitly convert expression
> (getSize(cast(const(char[]))this._libFileName)) of type ulong to uint
> 
> I can use the buffered version fine:
> auto filename = r"C:\file.dat";
> File file;
> try
> {
> file = File(filename, "r");
> }
> catch (ErrnoException exc)
> {
> return;
> }
> 
> ubyte[16] digest;
> MD5_CTX context;
> context.start();
> 
> foreach (ubyte[] buffer; file.byChunk(4096 * 1024)) {
> context.update(buffer);
> }
> 
> context.finish(digest);
> writefln("MD5 (%s) = %s", filename, digestToString(digest));
> 
> But I'd prefer to write simpler code and use rawRead to read the entire
> file at once. I'm reading really small files, so rawRead should be fine.

To read an entire file at once, you should use std.file.read(), or 
std.file.readText() if it's an UTF encoded text file.


> Also, why do we have file handling in two different modules? I'd expect
> to find all file handling ops in std.file, not scattered around Phobos.
> 
> Let me know if I'm doing something obviously stupid. :)

There are actually three modules for file handling, but I think they are 
nicely separated:

  - std.file handles files as isolated units, i.e. it reads,
writes and manipulates entire files.

  - std.path manipulates file/directory names as strings, and
performs no disk I/O.

  - std.stdio is for more advanced file I/O, as it lets you
open files and manipulate them through the File handle.
(This includes reading, writing, seeking, etc.)

Hope this clears things up. :)

-Lars