digitalmars.D - sc.ini and delegates
- Eugene Yang (25/25) Feb 24 2014 Hello all,
- TheFlyingFiddle (13/38) Feb 24 2014 The array itself is not casted to a dchar array, but when
- Nick Sabalausky (23/31) Feb 24 2014 sc.ini isn't really the right place for custom or project-specific
Hello all, If I want to set custom imports and library search paths for a specific project, how do I specify those paths in the sc.ini file? Setting the DFLAGS environment variable seems to override the default settings; is there a way I can append to the default DFLAGS variable? Also, if I try to compile this code import std.stdio, std.algorithm; char toInverse(in char input) { if(input == 'a') return 'b'; return 'c'; } void main(string[] args) { string line = readln(); auto result = line.map!(toInverse); writeln(result); } I get an error saying that toInverse is not callable with the argument type dchar. Why is line, which should be immutable(char)[] being casted as a dchar array? Thanks in advance, Eugene Yang
Feb 24 2014
On Monday, 24 February 2014 at 20:54:55 UTC, Eugene Yang wrote:Hello all, If I want to set custom imports and library search paths for a specific project, how do I specify those paths in the sc.ini file? Setting the DFLAGS environment variable seems to override the default settings; is there a way I can append to the default DFLAGS variable? Also, if I try to compile this code import std.stdio, std.algorithm; char toInverse(in char input) { if(input == 'a') return 'b'; return 'c'; } void main(string[] args) { string line = readln(); auto result = line.map!(toInverse); writeln(result); } I get an error saying that toInverse is not callable with the argument type dchar. Why is line, which should be immutable(char)[] being casted as a dchar array? Thanks in advance, Eugene YangThe array itself is not casted to a dchar array, but when iterating over a string using range interfaces (eg map!(...) in your code) it will do the iteration over dchars instead of char. This is to make it simpler to write correct unicode processing code. How this is done is simply that the string.front property has the type dchar and whenever you access it some unicode processing will be done. This is quite counter intuitive the first time you run into it. See http://forum.dlang.org/thread/urhhmrnzovxnyufcipwt forum.dlang.org#post-mailman.384.1389668512.15871.digitalmars-d-l arn:40puremagic.com for a more indepth view on why and how string iteration is implemented in this way.
Feb 24 2014
On 2/24/2014 3:54 PM, Eugene Yang wrote:Hello all, If I want to set custom imports and library search paths for a specific project, how do I specify those paths in the sc.ini file? Setting the DFLAGS environment variable seems to override the default settings; is there a way I can append to the default DFLAGS variable?sc.ini isn't really the right place for custom or project-specific imports. Just use the compiler's -I... flag, and wrap it up in a one-liner shell script if you need to.I get an error saying that toInverse is not callable with the argument type dchar. Why is line, which should be immutable(char)[] being casted as a dchar array?Because of Unicode. Despite the outdated name, a "char" is not really a character, it's a UTF-8 code unit, not a code point, and not a grapheme (ie a full character). See this if you're not already up-to-speed on code units vs code points: http://www.joelonsoftware.com/articles/Unicode.html Working with code units instead of code points is usually the wrong thing to do and leads to lots of bugs with non-english text. So by default, D iterates strings by 32-bit code point, not by code unit (behind the scenes, it calls decode()). Since code points and code units are ONLY equivalent in UTF-32, D always uses the 32-bit dchar to represent code points. So no matter whether you're iterating a UTF-8 string, a UTF-16 wstring or UTF-32 dstring, D's default is to always iterate by decoding one code point (as a dchar) at a time. In the rare cases you want to iterate by individual code units (never do this unless you have a strong grasp of Unicode and really know what you're doing), you can do this: string foo = ...; foreach(char ch; foo) {...}
Feb 24 2014