digitalmars.D - How to complex switch?
- Matthew Ong (23/23) May 12 2011 Hi All,
- KennyTM~ (25/48) May 12 2011 Regex isn't even a built-in feature, why would a 'switch' should support...
- matthew ong (11/11) May 12 2011 Hi KennyTM~,
- Matthew Ong (20/20) May 12 2011 Sample Code of Bash left out in previous post.
- KennyTM~ (31/42) May 12 2011 Invalid,
- Ary Manzana (7/23) May 12 2011 How about making regex a built-in feature with this syntax: /regex/ ?
- KennyTM~ (7/33) May 12 2011 IIRC it was once there, but very soon removed in the 0.x era (can't find...
- Ary Manzana (4/37) May 13 2011 Ruby can do it. I'm a happier programmer this way. If you don't support
- Jacob Carlborg (8/47) May 15 2011 I'm pretty sure this is a big reason:
- Matthew Ong (6/6) May 16 2011 Hi,
- Stewart Gordon (12/23) May 17 2011 There was a builtin regexp feature added in 0.147 - I think it was a ~~ ...
- bearophile (6/8) May 17 2011 Leaving regexps to a library is an acceptable choice for D, or maybe eve...
- Timon Gehr (26/34) May 17 2011 best choice. In D even associative arrays are not so important as builti...
- bearophile (8/14) May 17 2011 I don't see it as a bad design. Why do you see it as a bad thing?
- Timon Gehr (21/35) May 18 2011 Library code should make use of the language to implement its semantics.
- bearophile (6/13) May 18 2011 Looking different from the built-in ones was the point of it, to avoid c...
- Timon Gehr (39/52) May 18 2011 Short story: Obvious?
- Andrei Alexandrescu (11/56) May 18 2011 [snip]
- bearophile (21/28) May 18 2011 If this works, then I like it. In the end having some syntas, any syntax...
- Timon Gehr (28/44) May 19 2011 How would it be difficult to realize? I guess there is literally no seri...
- Robert Clipsham (9/15) May 13 2011 Regex is ugly, impossible to maintain/debug and slow for anything mildly...
- Dmitry Olshansky (19/32) May 13 2011 Handwritten parser is faster, but hard to get right, port or maintain.
- KennyTM~ (3/36) May 13 2011 Nitpick: *Innermost* parenthesized expression can be parsed easily with
- Dmitry Olshansky (4/47) May 13 2011 Yeah, I certainly meant outermost ;)
- Dmitry Olshansky (9/58) May 13 2011 Actually, wait a sec...
- Robert Clipsham (22/45) May 13 2011 When you've written a couple it doesn't take much to get it right in my
- Dmitry Olshansky (17/61) May 13 2011 Literally code the same in another programming language. Suppose there
- Robert Clipsham (11/33) May 14 2011 extern(C) - you can now access it with C/C++, and D has bindings for a
- dennis luehring (3/4) May 12 2011 just a question - did you thought about that longer then 1 minute?
- Matthew Ong (19/27) May 12 2011 I do not think that this is syntactic sugar. Compare this 2 block of cod...
- dennis luehring (20/29) May 12 2011 ok, but how many times you suffering of masses of this code - and what
- Matthew Ong (33/33) May 12 2011 @dennis luehring
- dennis luehring (8/15) May 12 2011 in simple/trivial cases, and when i becomes more complex
- Matthew Ong (5/9) May 12 2011 I fail to see what is being addressed here in relation to switch.
- dennis luehring (8/20) May 12 2011 realated to your awk-it-easier-for-codegenerators --> that are
- Matthew Ong (21/21) May 12 2011 Hi Dennis,
- Timon Gehr (20/41) May 12 2011 Note that it would in principle be possible to have a library-based solu...
- dennis luehring (8/23) May 12 2011 sorry for that - but i do not got the feeling that you spend much time
- Timon Gehr (8/17) May 12 2011 I think he was referring to the fact that D's mixin and import allow you...
-
Stewart Gordon
(7/10)
May 17 2011
- Daniel Gibson (2/16) May 17 2011
- Stewart Gordon (6/9) May 26 2011 I guess that would make sense. But actually, syntactic saccharin is som...
-
Stewart Gordon
(12/14)
May 26 2011
- Andrei Alexandrescu (10/18) May 12 2011 This is a nice feature, but probably it won't be added to D.
- Matthew Ong (13/13) May 12 2011 Hi,
- Michel Fortin (20/30) May 12 2011 The idea is nice. But it breaks one interesting fundamental property of
- bearophile (8/9) May 12 2011 I think there are no plans in adding a switch as powerful as you ask.
Hi All, Anyway to include this cool feature of switch with D in the near future? switch(str){ // regexp case "abc", "def", "as+b?": s1(); break; case "za+", "wd?", "aaa": s2(); break; default: s3(); } switch (tag) { default: s3() case 0, 1, 2, 3: s1() case 4, 5, 6, 7: s2() } switch (x := f();) { // missing switch expression means "true" case x < 0: return -x default: return x } switch (x){ case x < y: f1() case x < z: f2() case x == 4: f3() case z+y: f4() }
May 12 2011
On May 12, 11 19:13, Matthew Ong wrote:Hi All, Anyway to include this cool feature of switch with D in the near future?Why the obsession with 'switch'? 'if' works fine.switch(str){ // regexp case "abc", "def", "as+b?": s1(); break; case "za+", "wd?", "aaa": s2(); break; default: s3(); }Regex isn't even a built-in feature, why would a 'switch' should support it. if (match(str, regex("abc|def|as+b?")) s1(); else if (match(str, regex("za+|wd?|aaa")) s2(); else s3();switch (tag) { default: s3() case 0, 1, 2, 3: s1() case 4, 5, 6, 7: s2() }Already possible (except you're missing the 'break;')switch (x := f();) { // missing switch expression means "true" case x< 0: return -x default: return x }Please no. Why introduce yet another operator ':=' ?! auto x = f(); if (x < 0) return -x; else return x;switch (x){ case x< y: f1() case x< z: f2() case x == 4: f3() case z+y: f4() }Assume you don't mean to fall-through if (x < y) f1(); else if (x < z) f2(); else if (x == 4) f3(); else if (x == z+y) f4();
May 12 2011
Hi KennyTM~, Some of the valid reason: 1) Less key stroke 2) Easier code generator to implement 3) Better to read. 4) less worries about braket '{'. 5) .... In Java, C++ we avoided using switch because it ONLY support const & literal type. Most script base language supports things like this. I believe bash shell script does. Since D aimed to be a next generation language, I suppose that should be in with fall through also.
May 12 2011
Sample Code of Bash left out in previous post. ---------------------------------------------------------------------- case $space in [1-6]*) // <<< That if some sort of such logic can be supported in D. Message="All is quiet." ;; [7-8]*) Message="Start thinking about cleaning out some stuff. There's a partition that is $space % full." ;; 9[1-8]) Message="Better hurry with that new disk... One partition is $space % full." ;; 99) Message="I'm drowning here! There's a partition at $space %!" ;; *) Message="I seem to be running with an nonexistent amount of disk space..." ;; esac
May 12 2011
On May 12, 11 20:04, matthew ong wrote:Hi KennyTM~, Some of the valid reason: 1) Less key strokeInvalid, switch (x = f()) { case x < 0: return -x default: return x } 50 significant characters auto x = f(); if (x < 0) return -x; else return x; 41 significant characters2) Easier code generator to implementInvalid. Both share the same structure. switch (x = <variable>) { case <condition>: <statements> break; case <condition>: <statements> break; default: <statements> break; } auto x = <variable>; if (<condition>) { <statements>; } else if (<condition>) { <statements>; } else { <statements>; }3) Better to read.I don't think so.4) less worries about braket '{'.More worries about missing 'break;' (bad C heritage)5) ........In Java, C++ we avoided using switch because it ONLY support const& literal type.D also only supports literals types. A 'switch' statement is often implemented as a look-up table when compiled, so keeping the cases a compile-time constant helps to generate more efficient code. If you can supply an arbitrary condition or a regex, this advantage is lost and it's no better than a if/else-if/else chain.Most script base language supports things like this. I believe bash shell script does. Since D aimed to be a next generation language, I suppose that should be in with fall through also.No one forced a "next generation language" have to have a 'switch' with conditional or regex cases. Look, Python 3 doesn't even have a 'switch'.
May 12 2011
On 5/12/11 6:42 PM, KennyTM~ wrote:On May 12, 11 19:13, Matthew Ong wrote:How about making regex a built-in feature with this syntax: /regex/ ? I didn't use regex a lot before I started using Ruby. The thing is, in Ruby it's so easy to use regex that I just started using them a lot more than before. Of course, ruby has built-in operators for matching regexs, so maybe that should also be added to the language (it's the =~ operator, but in D it should be a different one.)Hi All, Anyway to include this cool feature of switch with D in the near future?Why the obsession with 'switch'? 'if' works fine.switch(str){ // regexp case "abc", "def", "as+b?": s1(); break; case "za+", "wd?", "aaa": s2(); break; default: s3(); }Regex isn't even a built-in feature, why would a 'switch' should support it.
May 12 2011
On May 13, 11 12:14, Ary Manzana wrote:On 5/12/11 6:42 PM, KennyTM~ wrote:IIRC it was once there, but very soon removed in the 0.x era (can't find that changelog). You can't distinguish between division and regex literal in the parser with this syntax. See: - http://www.digitalmars.com/d/2.0/faq.html#regexp_literals - http://www.digitalmars.com/d/2.0/regular-expression.htmlOn May 12, 11 19:13, Matthew Ong wrote:How about making regex a built-in feature with this syntax: /regex/ ? I didn't use regex a lot before I started using Ruby. The thing is, in Ruby it's so easy to use regex that I just started using them a lot more than before. Of course, ruby has built-in operators for matching regexs, so maybe that should also be added to the language (it's the =~ operator, but in D it should be a different one.)Hi All, Anyway to include this cool feature of switch with D in the near future?Why the obsession with 'switch'? 'if' works fine.switch(str){ // regexp case "abc", "def", "as+b?": s1(); break; case "za+", "wd?", "aaa": s2(); break; default: s3(); }Regex isn't even a built-in feature, why would a 'switch' should support it.
May 12 2011
On 5/13/11 12:10 PM, KennyTM~ wrote:On May 13, 11 12:14, Ary Manzana wrote:Ruby can do it. I'm a happier programmer this way. If you don't support it in the language the compiler is happy and the user is sad. :-( But the user is more important than the compiler...On 5/12/11 6:42 PM, KennyTM~ wrote:IIRC it was once there, but very soon removed in the 0.x era (can't find that changelog). You can't distinguish between division and regex literal in the parser with this syntax.On May 12, 11 19:13, Matthew Ong wrote:How about making regex a built-in feature with this syntax: /regex/ ? I didn't use regex a lot before I started using Ruby. The thing is, in Ruby it's so easy to use regex that I just started using them a lot more than before. Of course, ruby has built-in operators for matching regexs, so maybe that should also be added to the language (it's the =~ operator, but in D it should be a different one.)Hi All, Anyway to include this cool feature of switch with D in the near future?Why the obsession with 'switch'? 'if' works fine.switch(str){ // regexp case "abc", "def", "as+b?": s1(); break; case "za+", "wd?", "aaa": s2(); break; default: s3(); }Regex isn't even a built-in feature, why would a 'switch' should support it.
May 13 2011
On 2011-05-13 14:59, Ary Manzana wrote:On 5/13/11 12:10 PM, KennyTM~ wrote:I'm pretty sure this is a big reason: "Regular expression literal syntax - doing so would make it impossible to perform lexical analysis without also doing syntactic or semantic analysis." From: http://www.digitalmars.com/d/2.0/regular-expression.html -- /Jacob CarlborgOn May 13, 11 12:14, Ary Manzana wrote:Ruby can do it. I'm a happier programmer this way. If you don't support it in the language the compiler is happy and the user is sad. :-( But the user is more important than the compiler...On 5/12/11 6:42 PM, KennyTM~ wrote:IIRC it was once there, but very soon removed in the 0.x era (can't find that changelog). You can't distinguish between division and regex literal in the parser with this syntax.On May 12, 11 19:13, Matthew Ong wrote:How about making regex a built-in feature with this syntax: /regex/ ? I didn't use regex a lot before I started using Ruby. The thing is, in Ruby it's so easy to use regex that I just started using them a lot more than before. Of course, ruby has built-in operators for matching regexs, so maybe that should also be added to the language (it's the =~ operator, but in D it should be a different one.)Hi All, Anyway to include this cool feature of switch with D in the near future?Why the obsession with 'switch'? 'if' works fine.switch(str){ // regexp case "abc", "def", "as+b?": s1(); break; case "za+", "wd?", "aaa": s2(); break; default: s3(); }Regex isn't even a built-in feature, why would a 'switch' should support it.
May 15 2011
Hi, Seems like some people also had the same idea about D supporting more complex switch syntax and given more interesting reasons. Perhaps can be consider for D 3.0 or ... I am new here, please understand, but wish to see D take off because I do see some nice syntax in D.
May 16 2011
On 13/05/2011 06:10, KennyTM~ wrote:On May 13, 11 12:14, Ary Manzana wrote:<snip>There was a builtin regexp feature added in 0.147 - I think it was a ~~ or =~ operator with a string either side. I'm not sure whether it broke too much existing code or was just thought not right as a language builtin, but it was dropped again in 0.148.I didn't use regex a lot before I started using Ruby. The thing is, in Ruby it's so easy to use regex that I just started using them a lot more than before. Of course, ruby has built-in operators for matching regexs, so maybe that should also be added to the language (it's the =~ operator, but in D it should be a different one.)IIRC it was once there, but very soon removed in the 0.x era (can't find that changelog).You can't distinguish between division and regex literal in the parser with this syntax.And that's half the reason such a syntax has never been implemented in D.See: - http://www.digitalmars.com/d/2.0/faq.html#regexp_literals - http://www.digitalmars.com/d/2.0/regular-expression.htmlWhich ignores the idea of using a different notation for regexp literals. Though it's probably not worth much debate when the idea of a built-in regexp type has been rejected as language bloat. I think D is going the right way on the whole by leaving regexps to a library. Though this does limit such possibilities as optimised regexp switches. Stewart.
May 17 2011
Stewart Gordon:I think D is going the right way on the whole by leaving regexps to a library. Though this does limit such possibilities as optimised regexp switches.Leaving regexps to a library is an acceptable choice for D, or maybe even the best choice. In D even associative arrays are not so important as builtins, you just need literals for associative arrays. On the other hand my experience shows me some other things are better as builtins (or partial built-ins), as tuples. I'd like unpacking syntax sugar for tuples, to be used inside foreach too, and as recently emerged in D.learn, some better cast for tuples (to allow conversion of slightly differently typed tuples, and structural typing). Tuples are a general language construct, useful in many situations for many different purposes, they are _much_ more commonly useful than regex. I use some regex most Python scripts that processes lot of text, but I use tuples every 4-5 lines of code or less :-) And indeed, in Python too regexes are not built-in, while tuples are. Bye, bearophile
May 17 2011
Stewart Gordon:ThoughI think D is going the right way on the whole by leaving regexps to a library.best choice. In D even associative arrays are not so important as builtins, you just need literals for associative arrays.this does limit such possibilities as optimised regexp switches.Leaving regexps to a library is an acceptable choice for D, or maybe even theOn the other hand my experience shows me some other things are better asbuiltins (or partial built-ins), as tuples. I'd like unpacking syntax sugar for tuples, to be used inside foreach too, and as recently emerged in D.learn, some better cast for tuples (to allow conversion of slightly differently typed tuples, and structural typing).Tuples are a general language construct, useful in many situations for manydifferent purposes, they are _much_ more commonly useful than regex. I use some regex most Python > scripts that processes lot of text, but I use tuples every 4-5 lines of code or less :-) And indeed, in Python too regexes are not built-in, while tuples are.Bye, bearophileTuple literals would indeed be very nice. This _would_ mean that tuples get entirely built-in (having syntactic sugar for phobos functionality in the language seems like a very bad design to me, it would at least have to be copied/moved to druntime). However, tuple literals break the comma operator... But who would write something like ? auto t=(1,2,3); anyway in serious code? (where "," means comma operator). Therefore Tuple literals could be introduced by a minor change in the grammar, where uses of the comma operator like return a=2,b=3; would still work normally. What would be the type of such a tuple literal? (T,T,T,...)? I don't expect something like this to be implemented soon though. Timon
May 17 2011
Timon Gehr:Tuple literals would indeed be very nice.I have asked for tuple unpacking syntax (and other things like some support from the type system). Tuple literals are less needed.(having syntactic sugar for phobos functionality in the language seems like a very bad design to me,I don't see it as a bad design. Why do you see it as a bad thing?However, tuple literals break the comma operator...If something like a banana bracket syntax (|...|) is required (or some other kind of thing), then I think it doesn't clash with C usages of comma operator.What would be the type of such a tuple literal? (T,T,T,...)?I presume Tuple!(int, int, int)I don't expect something like this to be implemented soon though.Stuff like this requires months of thinking, and just few days to be implemented by Walter :-) Bye, bearophile
May 17 2011
Timon Gehr:the type system). Tuple literals are less needed.Tuple literals would indeed be very nice.I have asked for tuple unpacking syntax (and other things like some support fromLibrary code should make use of the language to implement its semantics. Not the other way round. They also screwed this up in C++0x with std::initializer_list;(having syntactic sugar for phobos functionality in the language seems like a very bad design to me,I don't see it as a bad design. Why do you see it as a bad thing?kind of thing), then I think it doesn't clash with C usages of comma operator. It does not clash with any other language feature because it is too ugly to have been considered as syntax for another language feature :). imho it would not be syntactic sugar anymore, that looks awful and is awful to type. Just my opinion though. Another reason I dislike it: it looks different to other "tuple literals" that are already built-in: foo (note, how, this, is, a, tuple, "!");However, tuple literals break the comma operator...If something like a banana bracket syntax (|...|) is required (or some otherIt would have to be a built-in type. (Even if it is internally just implemented as Tuple hanging around in druntime).What would be the type of such a tuple literal? (T,T,T,...)?I presume Tuple!(int, int, int)by Walter :-) If it is just some simple rewrites it should indeed be possible to implement it quite fast. Still, I think (|1,2,3|) is not optimal. Maybe the best way to resolve it would be to allow some special symbol as an identifier, so that the library/user could make that symbol an alias of "tuple". It would have to be a very small symbol, are there any suitable symbols that are not yet taken?I don't expect something like this to be implemented soon though.Stuff like this requires months of thinking, and just few days to be implementedBye, bearophileTimon
May 18 2011
Timon Gehr:Library code should make use of the language to implement its semantics. Not the other way round.Why?Another reason I dislike it: it looks different to other "tuple literals" that are already built-in: foo (note, how, this, is, a, tuple, "!");Looking different from the built-in ones was the point of it, to avoid clashes.Still, I think (|1,2,3|) is not optimal.Please, invent better things :-) Bye, bearophile
May 18 2011
Timon Gehr:Short story: Obvious? Do you really want to make some non-built-in types more equal than others? Why would you want to have a dependency cycle between std and the compiler? Longer story: You get all the drawbacks of a library-based solution except literal syntax (a one-character alias for tuple can already make up much of it without work from the compiler so your benefit is basically zero). But you want improved return type deduction, many will want tuple assignments in the style (a,b)=(b-a,a+b), etc. tuple cannot do it. Therefore the part the compiler takes will get so large that in the end the only relict of the library stuff will be that you have to import std.typecons; or else you will get some strange errors that do not at all look like your code. (Or even more silly, the compiler will directly nag you "Did you forget to import std.typecons?"). The question is, do you want to import typecons or not. It is just that and furthermore a question of clean design. How tuples are handled internally should be a compiler/runtime thing, not a standard library thing. I would be fine with Tuple!(T) defining conversions from and to the built-in tuple.Library code should make use of the language to implement its semantics. Not the other way round.Why?No. There is no way it could clash with foo (a,b,c). The only use case where the straightforward solution would clash is something like this: auto a=(i++,j++,k++); Nobody who is sane writes such code!Another reason I dislike it: it looks different to other "tuple literals" that are already built-in: foo (note, how, this, is, a, tuple, "!");Looking different from the built-in ones was the point of it, to avoid clashes.1. Deprecate using CommaExpression inside ParanthesizedExpression. (This does not affect most code that uses the comma operator!) 2. Wait a few releases. 3. Introduce straightforward, built-in tuples: auto t=(1,"string",'c'); auto (i,s,c)=t; //Tuple!(int,string,char) cannot do this. Maybe there is a better syntax for type inference, but I think this one it quite good. (auto x,auto y,auto d) s=(1,2,3.0); //... (can use s.x, s.y and s.d now) writeln(i," ",s," ",c); (string,) t=("this is a one-element tuple",); (int,int,int) q=(1,2,3); int[3] arr=q; //should be allowed in both directions, because arrays are basically special cases of tuples. function calls already reflect this. Other semantics could be similar to Tuple!(T). Maybe I missed some obvious feature. In that case, include that too. :)Still, I think (|1,2,3|) is not optimal.Please, invent better things :-)Bye, bearophileTimon
May 18 2011
On 5/18/11 5:12 PM, Timon Gehr wrote:[snip] We've been thinking of this approach but it would be difficult to pull off. One possibility that I hadn't thought before is to use ";" for separating tuple elements. Upon a casual inspection, it turns out no statement can be enclosed directly in "(" and ")" so there's no ambiguity. It would also take care of the issue "did you mean to pass them as function arguments, or as one tuple argument?" Just a thought... auto t=(1; "string"; 'c'); Ehm. AndreiTimon Gehr:Short story: Obvious? Do you really want to make some non-built-in types more equal than others? Why would you want to have a dependency cycle between std and the compiler? Longer story: You get all the drawbacks of a library-based solution except literal syntax (a one-character alias for tuple can already make up much of it without work from the compiler so your benefit is basically zero). But you want improved return type deduction, many will want tuple assignments in the style (a,b)=(b-a,a+b), etc. tuple cannot do it. Therefore the part the compiler takes will get so large that in the end the only relict of the library stuff will be that you have to import std.typecons; or else you will get some strange errors that do not at all look like your code. (Or even more silly, the compiler will directly nag you "Did you forget to import std.typecons?"). The question is, do you want to import typecons or not. It is just that and furthermore a question of clean design. How tuples are handled internally should be a compiler/runtime thing, not a standard library thing. I would be fine with Tuple!(T) defining conversions from and to the built-in tuple.Library code should make use of the language to implement its semantics. Not the other way round.Why?No. There is no way it could clash with foo (a,b,c). The only use case where the straightforward solution would clash is something like this: auto a=(i++,j++,k++); Nobody who is sane writes such code!Another reason I dislike it: it looks different to other "tuple literals" that are already built-in: foo (note, how, this, is, a, tuple, "!");Looking different from the built-in ones was the point of it, to avoid clashes.1. Deprecate using CommaExpression inside ParanthesizedExpression. (This does not affect most code that uses the comma operator!) 2. Wait a few releases. 3. Introduce straightforward, built-in tuples:Still, I think (|1,2,3|) is not optimal.Please, invent better things :-)
May 18 2011
Andrei:One possibility that I hadn't thought before is to use ";" for separating tuple elements. Upon a casual inspection, it turns out no statement can be enclosed directly in "(" and ")" so there's no ambiguity. It would also take care of the issue "did you mean to pass them as function arguments, or as one tuple argument?" Just a thought... auto t=(1; "string"; 'c');If this works, then I like it. In the end having some syntas, any syntax, for tuples is better than not being able to do things like: auto (foo; bar; _) = spam(); foreach ((a;b); iter1()) {} int foo(xy (int x; int y)) { writeln(x, " ", y, " ", xy); // naming whole tuple too (int x; int y) = (1U; 2U); // conversions Partially related note: currently this code: import std.stdio, std.range; void main() { writeln([0, 1, 2, 3, 4]); writeln(iota(5)); } Prints: [0, 1, 2, 3, 4] [0, 1, 2, 3, 4] In Bugzilla I have argued it to print instead: [0, 1, 2, 3, 4] [0; 1; 2; 3; 4] To allow the person that reads the output to better tell apart arrays from lazy sequences. Thank you, bearophile
May 18 2011
Andrei Alexandrescu wrote:Timon Gehr wrote:How would it be difficult to realize? I guess there is literally no serious D code out there that uses anything that could clash with tuple literals. (And if there is any - it can easily be rewritten to use inline delegates instead...) It should also be only a minor change in the grammar.1. Deprecate using CommaExpression inside ParanthesizedExpression. (This does not affect most code that uses the comma operator!) 2. Wait a few releases. 3. Introduce straightforward, built-in tuples:[snip] We've been thinking of this approach but it would be difficult to pull off.One possibility that I hadn't thought before is to use ";" for separating tuple elements. Upon a casual inspection, it turns out no statement can be enclosed directly in "(" and ")" so there's no ambiguity. It would also take care of the issue "did you mean to pass them as function arguments, or as one tuple argument?" Just a thought...other possibilites: 1. make tuple expansion explicit. //maybe not too great as the built-in TypeTuple expands by default. 2. use the same convention as that used for one-element tuples. void foo(int a,int b,int c); //1 void foo((int,int,int) t,); //2 auto t=(1,2,3); foo(t); //calls 1 (since t is expanded) foo(t,); //calls 2 (t is not expanded) This would change the meaning of trailing "," when tuples are involved though.auto t=(1; "string"; 'c');I have actually considered that too. Some issues: 1. ";" is not as easy to type as "," on many keyboard layouts. (not everybody will use a US Keyboard) 2. It is, like "(|1,2,3|)" another syntax for the same thing that is already present in the language, (template) parameter tuples. Furthermore, Array and AssocArray both use "," as a delimiter, meaning it would add further inconsistency. I think tuple literals should build up on existing features, not be orthogonal to them. imho tuple literals are a logical consequence of generalizing D's design, not an entirely new feature. 3. Most important: Error messages. If ";" is not guaranteed to be a statement delimiter, writing a compiler that can generate meaningful error messages is _much_ more difficult!Ehm. AndreiTimon
May 19 2011
On 13/05/2011 05:14, Ary Manzana wrote:How about making regex a built-in feature with this syntax: /regex/ ? I didn't use regex a lot before I started using Ruby. The thing is, in Ruby it's so easy to use regex that I just started using them a lot more than before. Of course, ruby has built-in operators for matching regexs, so maybe that should also be added to the language (it's the =~ operator, but in D it should be a different one.)Regex is ugly, impossible to maintain/debug and slow for anything mildly complicated - a handwritten parser is magnitudes faster, and easy to understand, maintain and debug. If it's simple, you may as well write a couple of extra lines and have it be a lot faster. Just my opinion of course, I know you're bound to disagree :> -- Robert http://octarineparrot.com/
May 13 2011
On 13.05.2011 18:25, Robert Clipsham wrote:On 13/05/2011 05:14, Ary Manzana wrote:Handwritten parser is faster, but hard to get right, port or maintain. Also handwritten parser has almost zero flexibility - patching it to accommodate new kinds of input is PITA. Regexes on the other hand are widely known DSL for pattern matching, which IMO easier to get right, port across languages and platforms (with caveats). Flexibility - regex engines in a way are just simple parser generators with some bells and whistles. And BTW they could be quite fast (depending on the use case, of course).How about making regex a built-in feature with this syntax: /regex/ ? I didn't use regex a lot before I started using Ruby. The thing is, in Ruby it's so easy to use regex that I just started using them a lot more than before. Of course, ruby has built-in operators for matching regexs, so maybe that should also be added to the language (it's the =~ operator, but in D it should be a different one.)Regex is ugly, impossible to maintain/debug and slow for anything mildly complicated - a handwritten parser is magnitudes faster, and easy to understand, maintain and debug. If it's simple, you may as well write a couple of extra lines and have it be a lot faster.Just my opinion of course, I know you're bound to disagree :>Probably you never faced problems like "get me some info from these <enter your gazillon number> simple reports/emails/etc." All things that don't follow some formal language enjoy flexibility on the parser side. E.g. you can patch together through try/trial cycle a couple of aproximate regexes and have very reasonable results in no time. The real pitfall of regexes vs handcrafted parsers is that they can't match important classes of problems like: "the innermost parenthesized expression in a given string" and such. -- Dmitry Olshansky
May 13 2011
On May 13, 11 23:12, Dmitry Olshansky wrote:On 13.05.2011 18:25, Robert Clipsham wrote:Nitpick: *Innermost* parenthesized expression can be parsed easily with regex (r"\([^)]*\)"). Outermost would be difficult.On 13/05/2011 05:14, Ary Manzana wrote:Handwritten parser is faster, but hard to get right, port or maintain. Also handwritten parser has almost zero flexibility - patching it to accommodate new kinds of input is PITA. Regexes on the other hand are widely known DSL for pattern matching, which IMO easier to get right, port across languages and platforms (with caveats). Flexibility - regex engines in a way are just simple parser generators with some bells and whistles. And BTW they could be quite fast (depending on the use case, of course).How about making regex a built-in feature with this syntax: /regex/ ? I didn't use regex a lot before I started using Ruby. The thing is, in Ruby it's so easy to use regex that I just started using them a lot more than before. Of course, ruby has built-in operators for matching regexs, so maybe that should also be added to the language (it's the =~ operator, but in D it should be a different one.)Regex is ugly, impossible to maintain/debug and slow for anything mildly complicated - a handwritten parser is magnitudes faster, and easy to understand, maintain and debug. If it's simple, you may as well write a couple of extra lines and have it be a lot faster.Just my opinion of course, I know you're bound to disagree :>Probably you never faced problems like "get me some info from these <enter your gazillon number> simple reports/emails/etc." All things that don't follow some formal language enjoy flexibility on the parser side. E.g. you can patch together through try/trial cycle a couple of aproximate regexes and have very reasonable results in no time. The real pitfall of regexes vs handcrafted parsers is that they can't match important classes of problems like: "the innermost parenthesized expression in a given string" and such.
May 13 2011
On 13.05.2011 19:26, KennyTM~ wrote:On May 13, 11 23:12, Dmitry Olshansky wrote:Yeah, I certainly meant outermost ;) -- Dmitry OlshanskyOn 13.05.2011 18:25, Robert Clipsham wrote:Nitpick: *Innermost* parenthesized expression can be parsed easily with regex (r"\([^)]*\)"). Outermost would be difficult.On 13/05/2011 05:14, Ary Manzana wrote:Handwritten parser is faster, but hard to get right, port or maintain. Also handwritten parser has almost zero flexibility - patching it to accommodate new kinds of input is PITA. Regexes on the other hand are widely known DSL for pattern matching, which IMO easier to get right, port across languages and platforms (with caveats). Flexibility - regex engines in a way are just simple parser generators with some bells and whistles. And BTW they could be quite fast (depending on the use case, of course).How about making regex a built-in feature with this syntax: /regex/ ? I didn't use regex a lot before I started using Ruby. The thing is, in Ruby it's so easy to use regex that I just started using them a lot more than before. Of course, ruby has built-in operators for matching regexs, so maybe that should also be added to the language (it's the =~ operator, but in D it should be a different one.)Regex is ugly, impossible to maintain/debug and slow for anything mildly complicated - a handwritten parser is magnitudes faster, and easy to understand, maintain and debug. If it's simple, you may as well write a couple of extra lines and have it be a lot faster.Just my opinion of course, I know you're bound to disagree :>Probably you never faced problems like "get me some info from these <enter your gazillon number> simple reports/emails/etc." All things that don't follow some formal language enjoy flexibility on the parser side. E.g. you can patch together through try/trial cycle a couple of aproximate regexes and have very reasonable results in no time. The real pitfall of regexes vs handcrafted parsers is that they can't match important classes of problems like: "the innermost parenthesized expression in a given string" and such.
May 13 2011
On 13.05.2011 19:35, Dmitry Olshansky wrote:On 13.05.2011 19:26, KennyTM~ wrote:Actually, wait a sec... r"\([^)]*\)" won't help : (a+(b+c)+d) matches: (a+(b+c) which is not intended... r"\([^()]*\)" should do the trick -- Dmitry OlshanskyOn May 13, 11 23:12, Dmitry Olshansky wrote:Yeah, I certainly meant outermost ;)On 13.05.2011 18:25, Robert Clipsham wrote:Nitpick: *Innermost* parenthesized expression can be parsed easily with regex (r"\([^)]*\)"). Outermost would be difficult.On 13/05/2011 05:14, Ary Manzana wrote:Handwritten parser is faster, but hard to get right, port or maintain. Also handwritten parser has almost zero flexibility - patching it to accommodate new kinds of input is PITA. Regexes on the other hand are widely known DSL for pattern matching, which IMO easier to get right, port across languages and platforms (with caveats). Flexibility - regex engines in a way are just simple parser generators with some bells and whistles. And BTW they could be quite fast (depending on the use case, of course).How about making regex a built-in feature with this syntax: /regex/ ? I didn't use regex a lot before I started using Ruby. The thing is, in Ruby it's so easy to use regex that I just started using them a lot more than before. Of course, ruby has built-in operators for matching regexs, so maybe that should also be added to the language (it's the =~ operator, but in D it should be a different one.)Regex is ugly, impossible to maintain/debug and slow for anything mildly complicated - a handwritten parser is magnitudes faster, and easy to understand, maintain and debug. If it's simple, you may as well write a couple of extra lines and have it be a lot faster.Just my opinion of course, I know you're bound to disagree :>Probably you never faced problems like "get me some info from these <enter your gazillon number> simple reports/emails/etc." All things that don't follow some formal language enjoy flexibility on the parser side. E.g. you can patch together through try/trial cycle a couple of aproximate regexes and have very reasonable results in no time. The real pitfall of regexes vs handcrafted parsers is that they can't match important classes of problems like: "the innermost parenthesized expression in a given string" and such.
May 13 2011
On 13/05/2011 16:12, Dmitry Olshansky wrote:When you've written a couple it doesn't take much to get it right in my experience. I don't find them hard to maintain personally, I guess that comes from experience though. What do you mean port? As for patching for new input, that's a doddle if it's well written. Changing a regex on the other hand... It's generally easier to write it from scratch than decipher a current one.Regex is ugly, impossible to maintain/debug and slow for anything mildly complicated - a handwritten parser is magnitudes faster, and easy to understand, maintain and debug. If it's simple, you may as well write a couple of extra lines and have it be a lot faster.Handwritten parser is faster, but hard to get right, port or maintain. Also handwritten parser has almost zero flexibility - patching it to accommodate new kinds of input is PITA.Regexes on the other hand are widely known DSL for pattern matching, which IMO easier to get right, port across languages and platforms (with caveats). Flexibility - regex engines in a way are just simple parser generators with some bells and whistles. And BTW they could be quite fast (depending on the use case, of course).Of course, I don't feel that grants them a place in the language though. Particularly with the likes of octal! - it can quite easily be in a library and work just as well.I have, and I use regex for it. Those kinda things just need a quick hack, and that's how I treat regex. If I'm doing anything that's getting used in production code/anything that isn't intended to be a hack I write a proper parser.Just my opinion of course, I know you're bound to disagree :>Probably you never faced problems like "get me some info from these <enter your gazillon number> simple reports/emails/etc." All things that don't follow some formal language enjoy flexibility on the parser side. E.g. you can patch together through try/trial cycle a couple of aproximate regexes and have very reasonable results in no time.The real pitfall of regexes vs handcrafted parsers is that they can't match important classes of problems like: "the innermost parenthesized expression in a given string" and such.KennyTM~ gave you regex for that, providing you mean outermost - \((.+)\) will do it. Somewhere inbetween is harder, but doable if I recall correctly. But yes, there is a whole class of problems regex can't solve. The real pitfall for me is how difficult it is to decypher/debug. -- Robert http://octarineparrot.com/
May 13 2011
On 13.05.2011 20:00, Robert Clipsham wrote:On 13/05/2011 16:12, Dmitry Olshansky wrote:Literally code the same in another programming language. Suppose there are going to be other programs working with the same data in similar ways.When you've written a couple it doesn't take much to get it right in my experience. I don't find them hard to maintain personally, I guess that comes from experience though. What do you mean port?Regex is ugly, impossible to maintain/debug and slow for anything mildly complicated - a handwritten parser is magnitudes faster, and easy to understand, maintain and debug. If it's simple, you may as well write a couple of extra lines and have it be a lot faster.Handwritten parser is faster, but hard to get right, port or maintain. Also handwritten parser has almost zero flexibility - patching it to accommodate new kinds of input is PITA.As for patching for new input, that's a doddle if it's well written. Changing a regex on the other hand... It's generally easier to write it from scratch than decipher a current one.I see, the deciphering could really get tricky. As for rewriting from scratch that's something you generally try hard to avoid with handwritten stuff.Sure thing it shouldn't be built it. D isn't awk.Regexes on the other hand are widely known DSL for pattern matching, which IMO easier to get right, port across languages and platforms (with caveats). Flexibility - regex engines in a way are just simple parser generators with some bells and whistles. And BTW they could be quite fast (depending on the use case, of course).Of course, I don't feel that grants them a place in the language though. Particularly with the likes of octal! - it can quite easily be in a library and work just as well.Ok, so I think we can agree on the simple fact that there are things that just do not worth handwritten parser.I have, and I use regex for it. Those kinda things just need a quick hack, and that's how I treat regex. If I'm doing anything that's getting used in production code/anything that isn't intended to be a hack I write a proper parser.Just my opinion of course, I know you're bound to disagree :>Probably you never faced problems like "get me some info from these <enter your gazillon number> simple reports/emails/etc." All things that don't follow some formal language enjoy flexibility on the parser side. E.g. you can patch together through try/trial cycle a couple of aproximate regexes and have very reasonable results in no time.Like I said, it's funny but it really can't do a lot with braces in general. It even fails to check balanced braces(of arbitrary depth). Yours \((.+)\) fails with (a+b*c) + ((a*b)+c) the _parenthesized expression_ here is "((A*B+C)" not "(a+b*c) + ((a*b)+c)" (It's an expression? - yes. It's parenthesized? - no)The real pitfall of regexes vs handcrafted parsers is that they can't match important classes of problems like: "the innermost parenthesized expression in a given string" and such.KennyTM~ gave you regex for that, providing you mean outermost - \((.+)\) will do it.Somewhere inbetween is harder, but doable if I recall correctly. But yes, there is a whole class of problems regex can't solve. The real pitfall for me is how difficult it is to decypher/debug.-- Dmitry Olshansky
May 13 2011
On 13/05/2011 17:52, Dmitry Olshansky wrote:extern(C) - you can now access it with C/C++, and D has bindings for a good few scripting languages! Why rewrite your code in another language at all? :DWhen you've written a couple it doesn't take much to get it right in my experience. I don't find them hard to maintain personally, I guess that comes from experience though. What do you mean port?Literally code the same in another programming language. Suppose there are going to be other programs working with the same data in similar ways.You generally don't need to rewrite it when it's hand written, just tweak it.As for patching for new input, that's a doddle if it's well written. Changing a regex on the other hand... It's generally easier to write it from scratch than decipher a current one.I see, the deciphering could really get tricky. As for rewriting from scratch that's something you generally try hard to avoid with handwritten stuff.Glad we agree!Of course, I don't feel that grants them a place in the language though. Particularly with the likes of octal! - it can quite easily be in a library and work just as well.Sure thing it shouldn't be built it. D isn't awk.Of course. -- Robert http://octarineparrot.com/I have, and I use regex for it. Those kinda things just need a quick hack, and that's how I treat regex. If I'm doing anything that's getting used in production code/anything that isn't intended to be a hack I write a proper parser.Ok, so I think we can agree on the simple fact that there are things that just do not worth handwritten parser.
May 14 2011
Am 12.05.2011 13:13, schrieb Matthew Ong:Hi All,just a question - did you thought about that longer then 1 minute? what real problem does this syntactic sugare solves?
May 12 2011
dennis luehringjust a question - did you thought about that longer then 1 minute? what real problem does this syntactic sugare solves?I do not think that this is syntactic sugar. Compare this 2 block of code. Which is easier to read? I am not asking the level to be at bash shell script, (that would be great). Hopefully you get the idea that I am trying to communicate here. switch compare to if-else-chain is better to write and also avoided the compilation error. KennyTM~: := sorry, it should not have been there. Typo error.switch(str){ // regexp case "abc", "def", "as+b?": s1(); break; case "za+", "wd?", "aaa": s2(); break; default: s3(); }---------------------------------------------------------------------- if (match(str, regex("abc|def|as+b?")) { s1(); }else if (match(str, regex("za+|wd?|aaa")){ // a lot of () and | ... might have missed out one of them s2(); }else{ s3() } ----------------------------------------------------------------------
May 12 2011
Am 12.05.2011 14:21, schrieb Matthew Ong:dennis luehring----------------------------------------------------------------if (match(str, regex("abc|def|as+b?")) { s1(); }else if (match(str, regex("za+|wd?|aaa")){ // a lot of () and | ... might have missed out one of them s2(); }else{ s3() }ok, but how many times you suffering of masses of this code - and what happens if (normaly) your regex matches aren't enough - more states come in for example if (match(str, regex("abc|def|as+b?") && BLUB || BLA ... ) { s1(); }else if (match(str, regex("za+|wd?|aaa")){ ... then your switches getting more and more unreadable - your will seperate bool algeb. into some helper variables - like this bool special_active = match(str, regex("abc|def|as+b?") && BLUB || BLA; if ( special_ative ) { s1(); }else if (...){ ... so is see a little help in trivial cases but it won't solve any big problem out there
May 12 2011
dennis luehring ---------------------------------------------------------------------- if (match(str, regex("abc|def|as+b?") && BLUB || BLA ... ) { s1(); }else if (match(str, regex("za+|wd?|aaa")){ ... ---------------------------------------------------------------------- switch(str){ // regexp case "abc", "def", "as+b?": if( str == xxxx || str == yyyy && etc...){ // some other condition... s1(); } break; case "za+", "wd?", "aaa": s2(); break; default: s3(); } Denise, please note that I did not say it could not be done with if-else chain, but switch makes some logical writing easier and code generation processing easier. Some of the valid reason: 1) Less key stroke 2) Easier code generator to implement ( switch case can be processed by awk like script with marker like 'case' and 'break'. Most of the time, by making the code easier for man to read it also makes generations of code easier. http://www.digitalmars.com/d/ D is a systems programming language. Its focus is on combining the power and high performance of C and C++ with the programmer >productivity< of >modern< languages like Ruby and Python. Special attention is given to the needs of quality assurance, documentation, management, portability and reliability.
May 12 2011
Am 12.05.2011 14:58, schrieb Matthew Ong:Denise, please note that I did not say it could not be done with if-else chain,that is clearbut switch makes some logical writing easierin simple/trivial cases, and when i becomes more complex you switch back to inner case ifsand code generation processing easier.i don't see the point here - and i've written masses of codegensSome of the valid reason: 1) Less key stroke 2) Easier code generator to implement ( switch case can be processed by awk like script with marker like 'case' and 'break'.did you see the string mixin feature before? http://www.digitalmars.com/d/2.0/mixin.html no outer (parsing) generator needed anymore (with small exceptions) :)
May 12 2011
== Quote from dennis luehring (dl.soluz gmx.net)'s articleAm 12.05.2011 14:58, schrieb Matthew Ong:did you see the string mixin feature before? http://www.digitalmars.com/d/2.0/mixin.html no outer (parsing) generator needed anymore (with small exceptions) :)I fail to see what is being addressed here in relation to switch. What you have shown me is about Regexp and Mixin. Is mixin related to code generations or switch or...? Is there a way for you to show some sample code that demo what you wants to say?
May 12 2011
Am 12.05.2011 15:57, schrieb Matthew Ong:== Quote from dennis luehring (dl.soluz gmx.net)'s articleAm 12.05.2011 14:58, schrieb Matthew Ong:did you see the string mixin feature before? http://www.digitalmars.com/d/2.0/mixin.html no outer (parsing) generator needed anymore (with small exceptions) :)I fail to see what is being addressed here in relation to switch. What you have shown me is about Regexp and Mixin. Is mixin related to code generations or switch or...? Is there a way for you to show some sample code that demo what you wants to say?I fail to see what is being addressed here in relation to switch.realated to your awk-it-easier-for-codegenerators --> that are string-mixins forIs mixin related to code generations or switch or...?code-generationIs there a way for you to show some sample code that demo what youwants to say? i don't need to - your examples do show that your idea does not solve bad problems, or simple/medium ones very good - and the arguments about the code-generation isn't a big problem in D
May 12 2011
Hi Dennis, From what I can see u did not provide any clear answer and hence, I would only discount all your threads as hostile to someone new to D-Programming that is asking sincere and providing some clearly supportable features. If those feature are as what u have rapidly shot down. Then, may I ask, why the builder of bash and other similar script level language supports. From what I can see D is trying to bridge the gap of API level programming language and Scripting Language like Ruby and others. The point of success in any large scale and long term development cycle in shown clearly in the industry is to make things easy and approachable. And not to take a Guru(ONLY I know best) approach?? Mind you, you are not omnipotent. I am not too sure if you work for digitalmars. But I hope not, because that is what is being shown here. http://www.digitalmars.com/d/ ----------------------------------------------------- Notice: We >welcome feedback< about the D compiler or language, but please be explicit about any claims to intellectual property rights with a copyright or patent notice if you have such for your contributions.
May 12 2011
Note that it would in principle be possible to have a library-based solution that provides the functionality you want with the following syntax: import rswitch; // I made that module name up. ... mixin(rswitch(q{ switch(str){ case "abc", "def", "as+b?": if( str == xxxx || str == yyyy && etc...) s1(); } break; case "za+", "wd?", "aaa": s2(); break; default: s3(); } })); AST macros will eventually make this look even prettier but I think that will not be too soon. TimonHi Dennis, From what I can see u did not provide any clear answer and hence, I would only discount all your threads as hostile to someone new to D-Programming that is asking sincere and providing some clearly supportable features. If those feature are as what u have rapidly shot down. Then, may I ask, why the builder of bash and other similar script level language supports. From what I can see D is trying to bridge the gap of API level programming language and Scripting Language like Ruby and others. The point of success in any large scale and long term development cycle in shown clearly in the industry is to make things easy and approachable. And not to take a Guru(ONLY I know best) approach?? Mind you, you are not omnipotent. I am not too sure if you work for digitalmars. But I hope not, because that is what is being shown here. http://www.digitalmars.com/d/ ----------------------------------------------------- Notice: We >welcome feedback< about the D compiler or language, but please be explicit about any claims to intellectual property rights with a copyright or patent notice if you have such for your contributions.
May 12 2011
Am 12.05.2011 16:33, schrieb Matthew Ong:From what I can see u did not provide any clear answer and hence, I would only discount all your threads as hostile to someone new to D-Programming that is asking sincere and providing some clearly supportable features. If those feature are as what u have rapidly shot down. Then, may I ask, why the builder of bash and other similar script level language supports.sorry for that - but i do not got the feeling that you spend much time thinking about this "feature" - except "that would be cool"... but maybe its just the soundingFrom what I can see D is trying to bridge the gap of API level programming language and Scripting Language like Ruby and others. The point of success in any large scale and long term development cycle in shown clearly in the industry is to make things easy and approachable. And not to take a Guru(ONLY I know best) approach?? Mind you, you are not omnipotent.yes im not, but try to think more deep about your ideas, especially when beeing in contact with an new language that short timeI am not too sure if you work for digitalmars. But I hope not, because that is what is being shown here.very few poeple (if im correct) working for digitalmars - most contributors a freely helping - and there a several big players around here
May 12 2011
Matthew Ong wrote:== Quote from dennis luehring (dl.soluz gmx.net)'s articleI think he was referring to the fact that D's mixin and import allow you to write lightweight "parsers" for your own Domain Specific Languages. mixin(strange_switch_supporting_DSL_to_D(import("filename"))); I do not really see the value added to D by such a construct either btw. Its uses would be very rare while it would add some heavy complexity to the compiler. Not to mention regex support would have to become built-in etc. TimonAm 12.05.2011 14:58, schrieb Matthew Ong:did you see the string mixin feature before? http://www.digitalmars.com/d/2.0/mixin.html no outer (parsing) generator needed anymore (with small exceptions) :)I fail to see what is being addressed here in relation to switch. What you have shown me is about Regexp and Mixin. Is mixin related to code generations or switch or...? Is there a way for you to show some sample code that demo what you wants to say?
May 12 2011
On 12/05/2011 13:21, Matthew Ong wrote:dennis luehring<snip>I do not think that this is syntactic sugar. Compare this 2 block of code. Which is easier to read?<snip> Features to improve the readability of code are the very definition of syntactic sugar. Indeed, Prolog programmers rely on syntactic sugar a lot. Could you be thinking of syntactic saccharin? Stewart.
May 17 2011
Am 17.05.2011 22:44, schrieb Stewart Gordon:On 12/05/2011 13:21, Matthew Ong wrote:Sweet syntax with a disgusting bitter aftertaste? ;)dennis luehring<snip>I do not think that this is syntactic sugar. Compare this 2 block of code. Which is easier to read?<snip> Features to improve the readability of code are the very definition of syntactic sugar. Indeed, Prolog programmers rely on syntactic sugar a lot. Could you be thinking of syntactic saccharin?Stewart.
May 17 2011
On 17/05/2011 21:50, Daniel Gibson wrote:Am 17.05.2011 22:44, schrieb Stewart Gordon:<snip>I guess that would make sense. But actually, syntactic saccharin is something that may look at first like syntactic sugar but doesn't really help the programmer at all. Something I think would count is the so-called complex string syntax in PHP. Stewart.Could you be thinking of syntactic saccharin?Sweet syntax with a disgusting bitter aftertaste? ;)
May 26 2011
On 17/05/2011 21:44, Stewart Gordon wrote: <snip>Features to improve the readability of code are the very definition of syntactic sugar. Indeed, Prolog programmers rely on syntactic sugar a lot.<snip> Come to think of it, some of the everyday features of programming languages generally are syntactic sugar. For example: - comments - whitespace - operator precedence/associativity rules - comma-separated declarations - with statements - many of the logical operators found in C-like languages Stewart.
May 26 2011
On 5/12/11 6:13 AM, Matthew Ong wrote:Hi All, Anyway to include this cool feature of switch with D in the near future? switch(str){ // regexp case "abc", "def", "as+b?": s1(); break; case "za+", "wd?", "aaa": s2(); break; default: s3(); }This is a nice feature, but probably it won't be added to D. Somebody new to a programming language often has a collection of nice artifacts from the other languages she might know. At first, they seem very worthwhile and of obvious benefit. Once the person continues using the language for a while, a sense develops for what is in the spirit of that language and what is less so. The opposition to this feature has been more or less rationalization of that intuition. Thanks for joining, Andrei
May 12 2011
Hi, The over all process perhaps is wrong, I would use a more mature enviroment with huge sets or code sample to build some commonly used routine for myself. And later export them into various different language using process like this. http://xes.sourceforge.net/ The library that I shown so far was in Java and I do have some plan ... The more higher level an (API + Script like) language can go the better coding and providing ease of usage is key for success. Just a process level idea, in the real world mission critical requirements has more needs. Like Finance, Military and Telco.
May 12 2011
On 2011-05-12 07:13:59 -0400, Matthew Ong <ongbp yahoo.com> said:Anyway to include this cool feature of switch with D in the near future? switch(str){ // regexp case "abc", "def", "as+b?": s1(); break; case "za+", "wd?", "aaa": s2(); break; default: s3(); }The idea is nice. But it breaks one interesting fundamental property of the switch statement: in a switch statement, each 'case' is mutually exclusive with every other so that the order of the 'case' labels has no importance when choosing which one to jump to. Try it: the compiler will generate a compile-time error if two cases attempt to match the same value. It also means that you can put 'default' in the middle of the 'switch' statement if you want and it won't prevent following cases from being matched: switch (str) { case "za+", "wd?", "aaa": s2(); break; default: s3(); break; case "abc", "def", "as+b?": s1(); break; } How this is this exclusivity supposed to be enforceable with a regular expression (or other kinds of pattern matching) remains nebulous. -- Michel Fortin michel.fortin michelf.com http://michelf.com/
May 12 2011
Matthew Ong:Anyway to include this cool feature of switch with D in the near future?I think there are no plans in adding a switch as powerful as you ask. The idea of adding pattern matching to D as in functional languages (as seen in Haskell, OCaML or even Scala) was discussed, it's a nice feature if you also have algebraic data types, but it will not be added to D2 and probably not even to D3, despite D wants to be a bit functional too. On the other hand there is an enhancement request about making switch a little more powerful: http://d.puremagic.com/issues/show_bug.cgi?id=596 D switch already supports switching on strings, so switching on arrays too (like an array of ints) is probably not too much hard to add. And switching on structs too will be quite useful (example: BigInts too become usable). Such switch enhancements probably aren't for D2. Bye, bearophile
May 12 2011