Re: Determine if CTFE or RT
On Sunday, 24 June 2018 at 19:10:36 UTC, Mr.Bingo wrote: On Sunday, 24 June 2018 at 18:21:09 UTC, rjframe wrote: On Sun, 24 Jun 2018 14:43:09 +, Mr.Bingo wrote: let is(CTFE == x) mean that x is a compile time constant. CTFE(x) converts a x to this compile time constant. Passing any compile time constant essentially turns the variable in to a compile time constant(effectively turns it in to a template with template parameter) You can use __ctfe: static if (__ctfe) { // compile-time execution } else { // run-time execution } This does not work: import std.stdio; auto foo(int i) { if (__ctfe) { return 1; } else { return 2; } } void main() { writeln(foo(3)); } should print 1 but prints 2. you have to call foo with ctfe enum n = foo(3); writeln(n);
Re: Quick Refresher book?
On Saturday, 16 June 2018 at 23:33:18 UTC, Aedt wrote: Hello, I was wondering if there's any quick refresher resource to brush up on my D after a long time? Is there a short and quick language reference book like "A Tour of C++"? if you havent seen it yet, there is the dlang tour https://tour.dlang.org
Re: Build interface from abstract class
On Tuesday, 29 May 2018 at 19:06:24 UTC, DigitalDesigns wrote: On Monday, 28 May 2018 at 22:15:40 UTC, arturg wrote: this might help you, https://dpaste.dzfl.pl/2cf844a11e3f you can use them to generate the functions as strings. Thanks, So, the problem I'm having is that I cannot use the generated interface for the abstract class because the abstract class needs the interface defined. I need to be able to forward define the interface then extend it. D doesn't like this main.d(10): Error: interface `main.B` base `A` is forward referenced interface A; mixin(Generate!(B,A)); interface B : A { } abstract class C : B { } would it work if you define the interface but mixin the members? interface A { mixin(InterfaceFromClass!C); }
Re: Build interface from abstract class
this might help you, https://dpaste.dzfl.pl/2cf844a11e3f you can use them to generate the functions as strings.
Re: Generating a method using a UDA
On Wednesday, 9 May 2018 at 10:16:22 UTC, Melvin wrote: I'm trying to find a friendly syntax for defining things in a framework. For context, I've been looking into finding a solution for this problem (https://github.com/GodotNativeTools/godot-d/issues/1) on the Godot-D project. I've done some investigating already, and it looks like I can only achieve what I want with a mixin, but I'd like to get a second opinion. Say we have a class that defines a custom Signal (an event). In an ideal world, the syntax would work similarly to this: class SomeNode : GodotScript!Node { @Signal void testSignal(float a, long b); // The declaration above would trigger the generation of this line void testSignal(float a, long b) { owner.emitSignal("testSignal", a, b); } @Method emitTest() { testSignal(3.1415, 42); } } The reason I want to use a UDA is to stay consistent with the other UDAs already defined for Properties and Methods. It also looks friendlier than using a mixin. Does anyone here have any thoughts as to how this could work? My main issue is injecting that generated method without resorting to using a mixin. I was hoping that any code I needed could be generated in the template that SomeNode inherits, but that doesn't look possible because I can't inspect the subclass (for good reason). hi, i actually have something like that, which i should put on github. i used it to learn about D's introspection, so its more of a prototype and will need some more work. it looks like this: class Test { mixin signalsOf!SigList; interface SigList { @Signal void someFun(int); } void someFunHandler(int){} } signalsOf takes a type/template or function list, introspects them then generates the actual signal functions. the additional api is similar to qt's api. void main() { Test t = new Test; t.connect!"someFun"(); t.someFun(4); // emit the signal t.disconnect!"someFun"(); } you can have different connection types and i also have string based connection and auto connection based on a naming convetion like signalname: someSig and slotname: onSomeSig.
Re: Delegates and classes for custom code.
On Wednesday, 18 April 2018 at 01:58:40 UTC, arturg wrote: is it this what you want? class A { int a; void delegate() onDraw; this(void delegate() dg) { onDraw = dg; } void drawText(string s) { s.writeln; } } void main() { A a; a = new A((){ a.a = 5; a.drawText("test"); "drawing all".writeln; }); } but if you do A a = new A((){ a.a = 5; ...}); the dg cant capture 'a' yet. so maybe it would be better to just do: A a = new A; a.onDraw = (){ a.drawText("test"); "draw rest".writeln; }; ah i see bauss already wrote the same. some other aproach could be: class Base { final void draw() { drawSelf(); } abstract void drawSelf(); } class A : Base { override void drawSelf() { ... } }
Re: Delegates and classes for custom code.
On Wednesday, 18 April 2018 at 01:12:33 UTC, Chris Katko wrote: That was all pseudo-code typed by hand. I got my code to work today. I don't know if it's the prettiest it can be, but it works: // TESTING ACCESS TO the OWNING function //--- class test_window { float x; float y; void draw_text(string text) { writeln(text); } this( void function(test_window) onDraw ) { this.onDraw = onDraw; } void run() //called every frame { onDraw(this); } void function (test_window) onDraw; } void test_dialog() { auto t = new test_window(function void(test_window ptr) { with(ptr) { draw_text( format("Hello, world. [x,y]=[%f,%f]", x, y)); } }); t.run(); } And a second attempt/version: // TESTING ACCESS to anything // -- struct data_to_access_t { int tacos; } struct data_to_access2_t { struct beans { int x; }; beans b; } class abc(T) { int x; void delegate(T) run_delegate; T data; this(T t, void delegate(T) d) { data = t; run_delegate = d; } void execute() { run_delegate(data); } } void test_dialog_anything() { data_to_access_t d; data_to_access2_t d2; d.tacos = 4; d2.b.x = 5; auto x = new abc!data_to_access_t ( d, (d) => writefln("test %d", d.tacos) ); auto y = new abc!data_to_access_t ( d, (d){writefln("test %d", d.tacos);} ); auto z = new abc!data_to_access2_t(d2, delegate void (d2){writefln("test2 %d", d2.b.x);} ); x.execute(); y.execute(); z.execute(); } My only questions are: - is there any way to make it "smart" enough to take the type of the argument, instead of me manually giving it a type. auto x = new abc!data_to_access_t ( d, (d) => writefln("test %d", d.tacos) ); becomes auto x = new abc( d, (d) => writefln("test %d", d.tacos) ); - Is there any way to eliminate the first d? Which is essentially a "this" pointer. auto x = new abc!data_to_access_t ( d, (d) => writefln("test %d", d.tacos) ); becomes auto x = new abc!data_to_access_t ( (d) => writefln("test %d", d.tacos) ); - And preferably, if possible, both. But I'll take what I can get. is it this what you want? class A { int a; void delegate() onDraw; this(void delegate() dg) { onDraw = dg; } void drawText(string s) { s.writeln; } } void main() { A a; a = new A((){ a.a = 5; a.drawText("test"); "drawing all".writeln; }); } but if you do A a = new A((){ a.a = 5; ...}); the dg cant capture 'a' yet. so maybe it would be better to just do: A a = new A; a.onDraw = (){ a.drawText("test"); "draw rest".writeln; };
Re: Help with specific template function
On Monday, 26 March 2018 at 06:40:34 UTC, Vladimirs Nordholm wrote: How would I resolve this issue? use the type not the variables: isNumeric!X && isNumeric!Y
Re: how to make private class member private
On Saturday, 17 March 2018 at 14:16:19 UTC, bauss wrote: I don't like the name @deny, personally I would rather see the private attribute changed to something like: private(true) // The member is oly visible to its parent. private(false) // Same as just "private", visible to whole module. Could be specialized to something like: private(this) // Same as private(true) private(module) // Same as private(false) maybe extend that to a list of types? private(typeof(this), Foo, Bar) would mean only typeof(this), Foo and Bar from the same module have access.
Re: How give a module to a CTFE function
On Monday, 12 March 2018 at 22:34:10 UTC, Xavier Bigand wrote: Ok, it works with the alias, I didn't see the last () in the implementFunctionsOf prototype. Thank you a lot. no problem. :)
Re: How give a module to a CTFE function
On Monday, 12 March 2018 at 22:28:30 UTC, Xavier Bigand wrote: I forgot to precise, that I don't have a main, because I am trying to create an opengl32.dll. This is why I already have a mixin to inject to function definitions in the root scope. you have to pass the string as a template arg so make implementFunctionsOf a template: string implementFunctionsOf(string mod)() { } then mix it in somewhere you want: mixin(implementFunctionOf!"std.stdio");
Re: How give a module to a CTFE function
On Monday, 12 March 2018 at 21:00:07 UTC, Xavier Bigand wrote: Hi, I have a CTFE function that I want to make more generic by given it a module as parameter. My actual code looks like : mixin(implementFunctionsOf()); string implementFunctionsOf() { import std.traits; string res; foreach(name; __traits(allMembers, myHardCodedModule)) { } return res; } I tried many things but I can't figure out the type of the parameter I should use for the function implementFunctionsOf. you can use a alias or a string: void fun(alias mod, string mod2)() { foreach(m; __traits(allMembers, mod)) pragma(msg, m); foreach(m; __traits(allMembers, mixin(mod2))) pragma(msg, m); } void main() { import std.stdio; fun!(std.stdio, "std.stdio"); }
context pointer breaks getOverloads, shouldn't it be ignored by it?
void main() { class Foo { void fun(){} } foreach(m; __traits(allMembers, Foo)) foreach(sym; __traits(getOverloads, Foo, m)) { } } this fails with: onlineapp.d(9): Error: no property this for type onlineapp.main.Foo onlineapp.d(9): Error: (Foo).this cannot be resolved it works fine if i add a `static if(m != "this")` or alternatively use std.meta.Erase("this", __traits(allMembers, Foo)).
Re: is it possible to put some DDOC after auto generated blocks like unittest examples?
On Monday, 5 March 2018 at 14:50:54 UTC, Adam D. Ruppe wrote: No, ddoc does not support that. You might be able to hack it with javascript though. thanks, yeah eigther that or a d script to do some postprocessing, so it can work without javascript.
is it possible to put some DDOC after auto generated blocks like unittest examples?
/// void fun(){} ///$(TABLE $(TR $(TD Back to:) $(TD href="#fun">Declaration) $(TD $(LINK2 #top, Top unittest { } it basically should look like this: Declaration void fun() Example --- --- [Back to:] [Declaration] [Top] and if i replace the embbeded html with $(LINK2 #fun, Declaration) inside the doc comment of the function it produses wrong html.
Re: isInputRange copied verbatim produces a different result than isInputRange from std.range
On Sunday, 4 March 2018 at 21:47:43 UTC, Jonathan M Davis wrote: On Sunday, March 04, 2018 21:03:23 arturg via Digitalmars-d-learn wrote: isn't this what DIP 1005 tried to solve? No. What DIP 1005 was trying to solve was avoiding having to have imports used by your function signature or template constraint on top-level constructs be available to the entire module. It wanted the imports to only kick in when the symbol that needed them was used. So, it would be possible to then import isInputRange as part of a function that needed it in its template constraint without the rest of the module seeing that import, whereas right now, such an import would have to be at the top level and would affect the entire module. DIP 1005 didn't do anything to make it so that other modules could see what you imported, and I doubt that any DIP ever would, because if that were possible, it would cause function hijacking, because you could force other modules to import what you wanted instead of what the person who wrote them imported. - Jonathan M Davis hm yeah i hoped that dip 1005 would be introspectable so you could use it instead of relying on udas.
Re: Get function argument name?
On Sunday, 4 March 2018 at 21:03:04 UTC, JN wrote: Imagine a function like this: void printValue(T)(string name, T value) { writeln(name, " = ", value); } int x = 10; printValue("x", x); is it somehow possible to convert that printValue into a mixin or something, so I could do something like: printValue(x); and it will figure out the "x" part automatically? you can pass it by alias: import std.stdio; void main(string[] args) { int x; printName!(x); } void printName(alias var)() { writeln(__traits(identifier, var), " ", var); }
Re: isInputRange copied verbatim produces a different result than isInputRange from std.range
On Sunday, 4 March 2018 at 19:58:14 UTC, ag0aep6g wrote: On 03/04/2018 08:54 PM, aliak wrote: wait a minute... so I can't use any std.range functions on a type if I add the range primitives as free functions? O.o Yes. In other words: You can't implement range primitives as free functions. Because std.range (and std.algorithm, etc.) doesn't know about them. isn't this what DIP 1005 tried to solve? as long as you dont want to role your own test its not possible. module moda; struct Imports { string importString; } template isInputRange(R) { import std.traits: hasUDA, getUDAs, ReturnType; static if(hasUDA!(R, Imports)) static foreach(u; getUDAs!(R, Imports)) mixin(u.importString); enum bool isInputRange = is(typeof(R.init) == R) && is(ReturnType!((R r) => r.empty) == bool) && is(typeof((return ref R r) => r.front)) && !is(ReturnType!((R r) => r.front) == void) && is(typeof((R r) => r.popFront)); } - module test; import std.stdio; import moda; void main(string[] args) { isInputRange!Type.writeln; } bool empty(Type t) { return true; } int front(Type t) { return 42; } void popFront(Type t) {} @Imports("import test: empty, front, popFront;") struct Type { }
Re: importing std.array: empty in a struct messes things up
On Sunday, 4 March 2018 at 20:07:06 UTC, visitor wrote: On Sunday, 4 March 2018 at 19:53:59 UTC, ag0aep6g wrote: On 03/04/2018 08:45 PM, ag0aep6g wrote: I don't know what's going on here. The error message doesn't make sense to me. Might be a bug in the compiler. This one works: struct Stack(T) { T[] stack; alias stack this; bool empty() {return empty(stack);} /* not using UFCS */ import std.array: empty; /* has to come after the method */ } Looks very much like a compiler bug now. As far as I know, the order of declarations shouldn't have an effect like that in structs. And UFCS should also be ok there, as far as I can tell. ? https://run.dlang.io/is/Ws0qEx https://run.dlang.io/is/Bancgx struct Stack(T) { import std.array: empty; T[] stack; alias stack this; bool empty() { return empty(stack); } } void main() { Stack!int stack; //bool x = stack.empty; // fails bool x = stack.empty(); // works }
Re: importing std.array: empty in a struct messes things up
I had the same issue, happens with any conflicting selective import. It seems to work if you dont use selective imports, but importing it inside the function if possible is a better option.
Re: Traits redux
On Saturday, 3 March 2018 at 16:20:57 UTC, JN wrote: https://run.dlang.io/gist/ec7008372d60ac52460dd58068f1ca6d?compiler=dmd Why only listUDA2 works and listUDA doesn't? Why do I need to use __traits(getMember again, if I use what I saved in a variable, it doesn't work :( because getUDAs returns only instantiations and ignores templates and scince hasUDA or getSymbolsByUDA uses it non of them work anymore. :( based on run.dlang.io it worked with dmd 2.071.2
Re: confused with data types
On Sunday, 18 February 2018 at 13:08:09 UTC, thorstein wrote: On Sunday, 18 February 2018 at 12:51:04 UTC, thorstein wrote: // Solution 1 foreach(row; arr) { foreach(col; row) { col[] *= skalar; } } return arr; // Solution 2 import std.array; return array(arr.map!(b => array(b[].map!(c => array(c[].map!(d => d * skalar)); // Solution 3 import std.algorithm; arr.each!(a => a[].each!(b => b[] *= skalar)); return arr; Q#1: Does the compiler optimizes all solutions equally strong or does it prefer implementations like solution 1? Q#2: Solution 2 is a 1-liner but a bit harder to read. Why reducing solution 3 to: return arr.each!(a => a[].each!(b => b[] *= skalar)); gives a compile error? I do writeln() the function result. Q#3: If I can: static import std.array; return std.array.array(arr.map!(b => std.array.array(b[].map!(c =>... How would I apply a similar version with 'static import std.algorithm' to solution 3? static import std.algorithm; std.algorithm.arr.each!(a => a[]... //does obviously not work Thanks, thorstein Sorry, Solution 2 should be: import std.array; return array(arr.map!(b => array(b[].map!(c => c[] *= skalar; and is as readable as Solution 3. However, Q#2 still remains. Q#1: i would guess solution 1 would be the fastest and solution 2 the slowest. Q#2: you get a error because each returns void. Q#3: you cant use ufcs with static imports, you have to call the function normaly: static import algo = std.algorithm; algo.each!((a) => algo.each!((b) => b[] *= skalar)(a))(arr);
Re: confused with data types
double[][] skalar_m_2d(double[][] arr, double skalar) { import std.algorithm; // return arr.map(a=> a[] *= skalar).array; arr.each!((ref a) => a[] *= skalar)); return arr; }
Re: is this a bug with writeln / std.algorithm.remove?
On Friday, 16 February 2018 at 13:57:07 UTC, Steven Schveighoffer wrote: You have a pretty good minimal test, put that in bugzilla along with the forum thread link and all the info we know. Mark it as a dmd bug, regression, along with the version where it regressed (2.076.1), and I would tag it as "rejects-valid" -Steve ok done https://issues.dlang.org/show_bug.cgi?id=18451
Re: is this a bug with writeln / std.algorithm.remove?
On Friday, 16 February 2018 at 13:28:59 UTC, Steven Schveighoffer wrote: Strictly speaking, this is not necessarily proof that it's in phobos, there could have been changes elsewhere that cause one of the conditions to fail. However, testing this out, I found something very weird. If you pragma(msg, isInputRange!(typeof(dgs))); inside your file, then it compiles (and prints true for that pragma). Makes no sense at all. Definitely seems like a compiler bug. A pragma(msg) shouldn't affect the outcome. -Steve ok so what should the bug report look like?
Re: is this a bug with writeln / std.algorithm.remove?
On Friday, 16 February 2018 at 11:45:21 UTC, arturg wrote: this code fails to compile: void delegate(void*) dg; void delegate(void*)[] dgs = [dg, dg, dg]; dgs.writeln; dgs.remove(1).writeln(); if you comment out dgs.writeln; it works as expected, it works if you use other types then void*: void delegate(int*) dg; void delegate(int*)[] dgs = [dg, dg, dg]; dgs.writeln; dgs.remove(1).writeln(); the compiler is DMD64 D Compiler v2.078.2 and the error message is: /usr/include/dlang/dmd/std/algorithm/mutation.d(1929): Error: template std.algorithm.mutation.moveAll cannot deduce function from argument types !()(void delegate(void*)[], void delegate(void*)[]), candidates are: /usr/include/dlang/dmd/std/algorithm/mutation.d(1455): std.algorithm.mutation.moveAll(InputRange1, InputRange2)(InputRange1 src, InputRange2 tgt) if (isInputRange!InputRange1 && isInputRange!InputRange2 && is(typeof(move(src.front, tgt.front empty.d(9): Error: template instance std.algorithm.mutation.remove!(cast(SwapStrategy)2, void delegate(void*)[], int) error instantiating running all dmd version on run.dlang.io gives me this output: Up to 2.075.1: Success with output: - [void delegate(void*), void delegate(void*), void delegate(void*)] [void delegate(void*), void delegate(void*)] - Since 2.076.1: Failure with output: - /path/to/dmd.linux/dmd2/linux/bin64/../../src/phobos/std/algorithm/mutation.d(1929): Error: template std.algorithm.mutation.moveAll cannot deduce function from argument types !()(void delegate(void*)[], void delegate(void*)[]), candidates are: /path/to/dmd.linux/dmd2/linux/bin64/../../src/phobos/std/algorithm/mutation.d(1455): std.algorithm.mutation.moveAll(InputRange1, InputRange2)(InputRange1 src, InputRange2 tgt) if (isInputRange!InputRange1 && isInputRange!InputRange2 && is(typeof(move(src.front, tgt.front onlineapp.d(7): Error: template instance std.algorithm.mutation.remove!(cast(SwapStrategy)2, void delegate(void*)[], int) error instantiating -
is this a bug with writeln / std.algorithm.remove?
this code fails to compile: void delegate(void*) dg; void delegate(void*)[] dgs = [dg, dg, dg]; dgs.writeln; dgs.remove(1).writeln(); if you comment out dgs.writeln; it works as expected, it works if you use other types then void*: void delegate(int*) dg; void delegate(int*)[] dgs = [dg, dg, dg]; dgs.writeln; dgs.remove(1).writeln(); the compiler is DMD64 D Compiler v2.078.2 and the error message is: /usr/include/dlang/dmd/std/algorithm/mutation.d(1929): Error: template std.algorithm.mutation.moveAll cannot deduce function from argument types !()(void delegate(void*)[], void delegate(void*)[]), candidates are: /usr/include/dlang/dmd/std/algorithm/mutation.d(1455): std.algorithm.mutation.moveAll(InputRange1, InputRange2)(InputRange1 src, InputRange2 tgt) if (isInputRange!InputRange1 && isInputRange!InputRange2 && is(typeof(move(src.front, tgt.front empty.d(9): Error: template instance std.algorithm.mutation.remove!(cast(SwapStrategy)2, void delegate(void*)[], int) error instantiating
Re: Struct initialization syntax
On Wednesday, 17 January 2018 at 17:37:07 UTC, H. S. Teoh wrote: On Wed, Jan 17, 2018 at 05:31:03PM +, Azi Hassan via Digitalmars-d-learn wrote: The D tour for structs uses a syntax similar to that of C++ in order to initialize a Person struct : Person p(30, 180). Is this syntax supported in D ? Running that part of the code neither works on the playground nor on my machine (dmd v2.076.0). You're probably looking for this syntax: auto p = Person(30, 180); T looks like a bug in the 3rd example.
Re: Detect if variable defined
On Friday, 29 September 2017 at 18:03:52 UTC, Joseph wrote: static if () { enum x; } static if (isDefined!x) { } What's the correct way to check if a variable has been defined? (note x may or may not be defined above. I need to know if it is) import std.traits; static if(hasMember!(T, "x")) { } or if at module level static if(__traits(hasMember, mixin(__MODULE__), "x")) { }
Re: no print function output do while
On Thursday, 28 September 2017 at 20:17:24 UTC, Ali Çehreli wrote: On 09/28/2017 12:18 PM, dark777 wrote: On Thursday, 28 September 2017 at 18:46:56 UTC, Ali Çehreli wrote: On 09/28/2017 08:13 AM, dark777 wrote: no print function output do while in my program after entering the data and select the function that will print on the screen the same is not printing .. and if I choose 'q' or 'Q' does the program not close what is happening? should not it work just like in C ++? https://pastebin.com/iiMVPk4x You made a simple logic error. Change the following || to &&: }while(choice != 'q' || choice != 'Q'); Ali I think it should not give this error good but until now I do not understand why after I enter with data in the function add_human the same is not printed when I choose the 'p' or 'P' option in the case void print_list(Human[] human_list) { foreach(human; human_list) { writefln("\nNome: %s",human.name); writefln("Peso: %0.2f",human.peso); writefln("Idade: %d\n",human.age); } } It's because add_human is appending to its own array. Change it to by-ref: void add_human(ref Human[] human_list) Ali while(choice != 'q' || choice != 'Q'); doesn't seem to exit the loop, while this works: while(choice != 'q'); or while(!(choice == 'q' || choice == 'Q')); wouldn't it be better to use a labeled statement instead? endless : while(true) { ... switch(choice) { ... case 'Q': case 'q': break endless; ... } }
Re: Base class' constructor is not implicitly inherited for immutable classes. A bug or a feature?
On Wednesday, 19 July 2017 at 16:00:56 UTC, Piotr Mitana wrote: Hello, I have this code: immutable class Base { this() {} } immutable class Derived : Base {} void main() { new immutable Derived(); } I'd like class Derived to automatically inherit the default constructor from Base. However, this is not the case: main.d(6): Error: class main.Derived cannot implicitly generate a default ctor when base class main.Base is missing a default ctor Is it a bug or it should be like this? compiles with: dmd 2.073 fails with: dmd 2.074 dmd 2.075
Re: Generic operator overloading for immutable types?
On Monday, 12 June 2017 at 19:51:37 UTC, Gary Willoughby wrote: I don't know how H. S. Teoh managed to answer 'before' I posted but thanks guys! :) might be a bug, happened here http://forum.dlang.org/post/ohbr5l$2mng$1...@digitalmars.com also.
Re: Problem with using readln.
On Sunday, 30 April 2017 at 05:53:09 UTC, Andrew Edwards wrote: string line; parse!int((line = readln)).writeln; is there a reason you mix normal call and ufc or just some style? you can do this and remove some () (line = readln).parse!int.writeln;
Re: @property
My issue isn't about @property, it just shows 3 cases where i think that dmd is missing a check for alias this. Even if D didnt had @property or parentesis less function call, due to alias opCall this it should be possible to call opCall without parentesis.
Re: @property
On Thursday, 8 December 2016 at 22:46:32 UTC, Jonathan M Davis wrote: On Thursday, December 08, 2016 22:11:22 ArturG via Digitalmars-d-learn wrote: On Thursday, 8 December 2016 at 16:54:57 UTC, Adam D. Ruppe wrote: > On Thursday, 8 December 2016 at 16:53:13 UTC, Satoshi wrote: >> is there any advantage of marking function as @property?? > > Not really. I think it just changes the meaning of > typeof(thatfunc) but otherwise it does nothing. > > However, if you use it in a base class, you must also use it > when overriding the function. it does when you add it to for example a struct with alias opCall this. reported it as a bug https://issues.dlang.org/show_bug.cgi?id=16951 but seems to be addressed by https://wiki.dlang.org/DIP23 ... - Jonathan M Davis i actually didnt want to use @property at all, as i asumed that by using alias opCall this it would always call opCall not only sometimes. the issue was about the commented line // a; // Error: var has no effect in expression (a) the rest can be solved by @property or a custom toString.
Re: @property
On Thursday, 8 December 2016 at 16:54:57 UTC, Adam D. Ruppe wrote: On Thursday, 8 December 2016 at 16:53:13 UTC, Satoshi wrote: is there any advantage of marking function as @property?? Not really. I think it just changes the meaning of typeof(thatfunc) but otherwise it does nothing. However, if you use it in a base class, you must also use it when overriding the function. it does when you add it to for example a struct with alias opCall this. reported it as a bug https://issues.dlang.org/show_bug.cgi?id=16951 but seems to be addressed by https://wiki.dlang.org/DIP23
wrong result from ParameterStorageClassTuple?
alias PSC = ParameterStorageClass; alias PSCT = ParameterStorageClassTuple; void fun1(return ref int){} void fun2(return out int){} PSCT!fun1 == (PSC.return_ | PSC.ref_) // false PSCT!fun2 == (PSC.return_ | PSC.out_) // false PSCT!fun1 == PSC.return_ // true PSCT!fun2 == PSC.return_ // true how to differentiate them?
Re: @property get/set or public varaible?
On Sunday, 4 December 2016 at 20:44:05 UTC, Jonathan M Davis wrote: On Sunday, December 04, 2016 15:30:22 vladdeSV via Digitalmars-d-learn wrote: Hello! I have a question not directly related to D as it is with coding standards. My issue at hand is if I have one variable for a class, which I want to be directly accessible for anything else, should it be 1. public, or 2. private, with @property get/setters? From what I have been told is that variables should be private. But if I do not want to make any checks whatsoever when setting a variable, I see no benefit to the private approach. Are there any other reasons to use get/setters? This might not be usefull for ure current usecase but if you want a property to behave like a field, it has to be a field. So a boxed type might be better depending how much you want to manage. Here are some property like examples: struct Prop(T) { private T value; alias opCall this; ref T opCall() { return value; } ref T opCall(T val) { return value = val; } string toString() { import std.conv: to; return value.to!string; } } struct ReadOnly(T) { private T value; alias opCall this; T opCall() { return value; } // return a copy string toString() { import std.conv: to; return value.to!string; } } struct WriteOnly(T) { private T value; void opAssign(T val) { value = val; } string toString() { return typeof(this).stringof; } } // alternative write only so you can chain opCall writeOnly(33)(56)(66); struct AltWriteOnly(T) { private T value; ref typeof(this) opCall(T val) { value = val; return this; } string toString() { return typeof(this).stringof; } } struct FunProp(T) if(isSomeFunction!T) { private T value; alias value this; void opAssign(T val) { value = val; } string toString() { return T.stringof; } } class Test { Prop!int someVal; ReadOnly!string name; WriteOnly!int someOtherVal; FunProp!(void delegate(int)) funProp; this() { name.value = "Test"; } } void main() { auto test = new Test; test.someVal = 66; test.someVal++; test.someOtherVal = 100; test.funProp = (int i) => i + test.someVal; test.someVal.writeln; test.name.writeln; test.funProp(33).writeln; test.funProp.writeln; test.someOtherVal.writeln; } haven't done extencive tests with them but they can be used as builing blocks, you can add other operator overloads to manage other access to the value. you can build better properties without @property :/
Is there some trait like getOverloads that works with mixin templates?
a simple example: mixin template v1() { void foo(){} } mixin template v2() { void foo(int){} } class Test { mixin v1; mixin v2; } void main() { __traits(getOverloads, Test, "foo").length.writeln; // 0 } i know you can use alias to manually make them visible for getOverloads. but i could use a automated way, at least for unnamed template mixins or to be able to merge all into the same named mixin scope. is there a way to do this?
Re: Construct D Arrray with explicit capacity
On Sunday, 30 October 2016 at 18:10:09 UTC, Nordlöw wrote: Is there a recommended way to create a builtin D array with a given capacity? I'm aware of the `.capacity` property. Is it ok to mutate it? you cant mutate capacity directly because its only a getter but you could use arr.reserve(someVal);
Re: mixin template hide
On Sunday, 24 July 2016 at 18:38:53 UTC, Eppason wrote: The obvious solution is to refactor Bar, but in the real world, it is much harder and life would be much easier if I could remove foo from exists inside S. At worse, if Bar did depend on foo, I would simply get errors about missing foo. I doubt it is possible, but maybe some tricks? you could define a flag for foo, like: mixin template BAR(bool addFoo = true) { mixin FOO; static if(addFoo) { void foo(){} } }
Re: Overloads
On Sunday, 26 June 2016 at 11:23:14 UTC, Márcio Martins wrote: Consider this snippet: struct X { int foo(Args...)(Args args) if (Args.length > 1) { return Args.length; } int foo() { return 0; } int foo(int y) { return 1; } alias Name = string; int field_; } void listMembers(T)(ref T x) { foreach (Member; __traits(derivedMembers, T)) { pragma(msg, Member, " ", __traits(getOverloads, x, Member).length); //pragma(msg, __traits(getProtection, __traits(getMember, x, Member))); // Error: argument string has no protection } } void main() { X x; listMembers(x); //auto fptr = // Error: x.foo(Args...)(Args args) if (Args.length > 0) is not an lvalue } Output: foo 0LU Name 0LU field_ 0LU foo 0LU Name 0LU field_ 0LU There seems to be a few problems here: 1. It seems like getOverloads is returning 0 for 'foo' - is this a bug? Was expecting a 3 or at least a 2 if the template would be ignored. 2. That alias breaks getProtection - is this bug? Seems like it should be public. These two make it quite hard to iterate over and collect info about arbitrary aggregates. I want to get a list of all *public* members, including pointers to all public member functions and their overloads, excluding template member functions. This is turning out to be hard due to these "unexpected behaviors". Is there anything else I can do? __traits(getOverloads, x, Member).length works if you place the template after a function of the overloads and then it returns 2. it fails as soon as the first member of the overload set is any template, so i guess it must be a bug. e.g. struct Fails { void foo()(){} void foo(int){} } struct Works { void foo(int){} void foo()(){} } __traits(getOverloads, Fails, "foo").length.writeln; // 0 __traits(getOverloads, Works, "foo").length.writeln; // 1
Re: stretto...@tutanota.com
you could also use a simple wrapped cast Ret castTo(Ret, T)(T t) if(is(T == class)) { return cast(Ret) t; } then do foo.stuff[0].castTo!Dong.x.writeln; and if you want to guard the access you could try foo.stuff[0].castTo!Dong.cc!((d){d.x = 5;}); cc is an alias for checkCall which is a template you can find here http://forum.dlang.org/thread/ltalqpmpscdoziser...@forum.dlang.org, it treats Type.init as false and ignores the call to fun. but its not restricted to nullables only e.g. float someF; iota(0, someF).writeln; // normally would throw an AssertError someF.cc!(f => iota(0, f)).writeln; // returns an empty range without calling iota, as float.nan is treated as false. same as 0.0.cc!(f => iota(0, f)).writeln;
Re: isCallable and templates
On Friday, 10 June 2016 at 17:32:03 UTC, Steven Schveighoffer wrote: Consider: import std.traits; class Foo { void bar() {} void baz()() {} } This works: static assert(isCallable!(Foo.bar)); This does not: static assert(isCallable!(Foo.baz)); However, clearly I can call baz due to IFTI (with the equivalent syntax, someFoo.baz() or someFoo.baz). Is there a way to fix this? -Steve i guess thats the same reason that isCallable!(unaryFun!someString) -> false if not, then it probably would also be usefull if it would be evaluated to true.
Formated string with assert inside template constraints?
is it supposed to work? normally it works e.g. assert(0, "some\nstring"); prints: some string but if you do it inside a template constraint like this: void someTemp(T)(T t) if(isCallable!T.call!((b){assert(b, "some\nstring");})) { } it prints: some\x0astring
Re: Why do some T.init evaluate to true while others to false?
On Friday, 27 May 2016 at 14:48:59 UTC, Adam D. Ruppe wrote: On Friday, 27 May 2016 at 14:43:47 UTC, ArturG wrote: if(value is typeof(value).init) ... that still requiers a special case for floating points, arrays and optionally empty string literals. Have you tried? That should work in all cases. does this count? struct Foo { int x; float f; } void main() { Foo foo; if(foo is typeof(foo).init) "A: does'nt work".writeln; foo = Foo(); if(foo is typeof(foo).init) "B: works".writeln; } if you remove the float from the struct both cases work or if you define the float inside the struct like this: struct Foo { int x; // float f = float.init; // does'nt work float f = float.nan; }
Re: Why do some T.init evaluate to true while others to false?
On Friday, 27 May 2016 at 18:03:23 UTC, Steven Schveighoffer wrote: I didn't change the default. The default is to pick the first member and use that as the init value. I may not have even considered what foo.init might be when I was creating my enum. -Steve by default i ment this enum foo { bar } foo f; if(f) "dosnt print".writeln; but i understand what you mean which adds a problem to my checkThen template, as the return type of the template depends on the return type of the callable which right now returns the init value of the callable return type if the type you pass into the template evaluates to false. an example: class Foo { int x; } Foo foo(){ return null; } foo.checkThen!( f => f.x = 5; ).writeln; // writes f.x.init because i kinda need a common return type if foo wouldnt return null
Re: Why do some T.init evaluate to true while others to false?
On Friday, 27 May 2016 at 16:56:21 UTC, Steven Schveighoffer wrote: Why are you expecting it to be? Won't work for enums with first elements that are non-zero either: enum foo : int { bar = 1; } foo f; if(f) writeln("this will output too"); -Steve but by default it works you just changed the default so its ok that it doesnt work.
Re: Why do some T.init evaluate to true while others to false?
On Friday, 27 May 2016 at 15:24:18 UTC, Adam D. Ruppe wrote: On Friday, 27 May 2016 at 15:19:50 UTC, ArturG wrote: yes but i have to check for that when some one does Why? This is no different than if they set any of the other four billion possible values. What do you mean? operation on float.nan gives you a float.nan so why does the shortcut evaluate to true and not false wouldnt that make more sense? float f; if(f) "why does this print".writeln; // it should not same for char char c; if(c) "why does this print".writeln; // it should not it works for most other types is there any reason why it doesnt work or couldnt work with floating points and character types?
Re: Why do some T.init evaluate to true while others to false?
On Friday, 27 May 2016 at 15:07:50 UTC, Adam D. Ruppe wrote: On Friday, 27 May 2016 at 14:56:28 UTC, ArturG wrote: float f; if(f is float.init) "float init".writeln; f = float.nan; if(f is float.init) "float nan".writeln; You changed it to a value that isn't float.init, so of course it isn't going to match! float.nan and float.init are NOT the same thing. float.init is a kind of NAN, but not the same kind. yes but i have to check for that when some one does float.nan.checkThen!((f){ this fun should not run }); which should be the same as float.init.checkThen!((f){ this fun should not run });
Re: Why do some T.init evaluate to true while others to false?
On Friday, 27 May 2016 at 14:48:59 UTC, Adam D. Ruppe wrote: On Friday, 27 May 2016 at 14:43:47 UTC, ArturG wrote: if(value is typeof(value).init) ... that still requiers a special case for floating points, arrays and optionally empty string literals. Have you tried? That should work in all cases. float f; if(f is float.init) "float init".writeln; f = float.nan; if(f is float.init) "float nan".writeln;
Re: Why do some T.init evaluate to true while others to false?
On Friday, 27 May 2016 at 09:25:55 UTC, Marc Schütz wrote: On Thursday, 26 May 2016 at 16:45:22 UTC, ArturG wrote: im just playing with this template[1] is there anything else i missed? (if you dont mind) it basically treats any T.init as false and skips the function/delegate and just returns type. [1] https://dpaste.dzfl.pl/d159d83e3167 If you just want to check whether something is equal to its type's .init value, use the `is` operator, which does a bitwise comparison: if(value is typeof(value).init) ... that still requiers a special case for floating points, arrays and optionally empty string literals.
Re: Why do some T.init evaluate to true while others to false?
On Thursday, 26 May 2016 at 15:51:39 UTC, Basile B. wrote: Oh, I'm so sorry ! I totally missed the point of the Q. float.nan is not a "unique" value. Several values verify "nan" (Look at std.math.isNan). So I suppose it's simpler to test for nullity. Though with the sign there's also two possible 0... void main(string[] args) { writeln(float.nan == float.init); // false import std.math: isNaN; writeln(isNaN(float.nan)); // true writeln(isNaN(float.init)); //true } So the shortcut in the compiler might be more simple, there is only a single test for "if(myFloat)"... im just playing with this template[1] is there anything else i missed? (if you dont mind) it basically treats any T.init as false and skips the function/delegate and just returns type. [1] https://dpaste.dzfl.pl/d159d83e3167
Re: Why do some T.init evaluate to true while others to false?
On Thursday, 26 May 2016 at 15:38:55 UTC, Basile B. wrote: because nan is not 0 and that the shortcut for float is if (fpValue) <=> if (fpValue != 0) if (!fpValue)<=> if (fpValue == 0) There's no relation between the initializer and the shortcut. It's not because for some values the shortcut matches to the initializer that it must always be the case...But I admit I don't know the exact rationale. Does anyone know ? Ok sorry for the noise and thanks anyway.
Re: Why do some T.init evaluate to true while others to false?
On Thursday, 26 May 2016 at 15:29:52 UTC, Basile B. wrote: float.init is not equal to 0.0f. In D FP points values are initialized to nan (not a number). By the way for strings it works, it's like the array case I described in the first answer). yes i guess i tested all/most types and know that float.init is float.nan but why is nan true and not false?
Re: Why do some T.init evaluate to true while others to false?
On Thursday, 26 May 2016 at 15:25:26 UTC, ag0aep6g wrote: On 05/26/2016 04:03 PM, ArturG wrote: for example: if(any floatingpoint.init) will be true if(any char.init) also true if("") also true while others are false e.g. string s; if(s) will be false all others are also false or did i miss any? What does it matter? You would have to create special cases for them.
Re: Why do some T.init evaluate to true while others to false?
On Thursday, 26 May 2016 at 15:15:57 UTC, Basile B. wrote: On Thursday, 26 May 2016 at 15:14:21 UTC, Basile B. wrote: On Thursday, 26 May 2016 at 15:11:50 UTC, Basile B. wrote: On Thursday, 26 May 2016 at 14:03:16 UTC, ArturG wrote: [...] [...] - integral(*): if (i) <=> if (i > 0) I obviously meant: - integral(*): if (i) <=> if (i <> 0) and "<=>" stands for "equivalence" I obviously meant: integral(*): if (i) <=> if (i != 0), "<>" is the Pascal operator for C's "!=" yes i know about most of those shortcuts its just float.init and char.init that work different then the other when you do this if(someType) // will be true for float and char while someType is T.init
Re: Effect of declaring a class immutable ?
On Thursday, 26 May 2016 at 14:12:23 UTC, chmike wrote: I couldn't find any information about this on the dlang web site. What is the effect adding the immutable attribute to a class like this immutable class MyClass { ... } The compiler doesn't complain. Will it add the immutable attribute to all members ? auto mc = new MyClass; typeof(mc.someFieldOrFun).stringof.writeln; says yes and if you define opCall you need to use auto mc = new immutable MyClass;
Why do some T.init evaluate to true while others to false?
for example: if(any floatingpoint.init) will be true if(any char.init) also true if("") also true while others are false e.g. string s; if(s) will be false all others are also false or did i miss any?
Re: Usage of custom class with JSONValue
On Thursday, 24 March 2016 at 08:24:46 UTC, Edwin van Leeuwen wrote: JSONValue only works with the build in types, not with user defined types. Either you define a specific function for the class that returns a JSONValue. Easiest way to do that would be to build an associative array with strings as keys with the names, and JSONValues as values and turn that into JSONValue, i.e. (untested): class MyClass { string[] _data; alias _data this; // ... JSONValue toJSON() { JSONValue[string] aa; JSONValue[] dataJSON = _data.map!((a) => JSONValue(a)).array; aa["data"] = JSONValue(dataJSON); return JSONValue(aa); } } isnt alias this supposed to do this implicitly? convert this auto jsValue = JSONValue(new MyClass()); into this auto jsValue = JSONValue((new MyClass())._data);
Re: why the sort result is different with C#
On Friday, 22 January 2016 at 06:53:29 UTC, mzf wrote: D code: auto arr = ["b1=1", "b=2","a1=1", "a=2"]; writeln(arr.sort()); output:["a1=1", "a=2", "b1=1", "b=2"] C# code: var arr = new string[]{ "b1=1", "b=2", "a1=1", "a=2" }; Array.Sort(arr); output:["a=2","a1=1","b=2","b1=1"] auto arr1 = ["b1=1", "b=2", "a1=1", "a=2"]; auto arr2 = ["b1 = 1", "b = 2", "a1 = 1", "a = 2"]; arr1.sort.writeln; // ["a1=1", "a=2", "b1=1", "b=2"] arr2.sort.writeln; // ["a = 2", "a1 = 1", "b = 2", "b1 = 1"]