Re: A problem in converting C code
On 11/2/21 6:49 PM, zjh wrote: On Tuesday, 2 November 2021 at 23:02:42 UTC, Ali Çehreli wrote: On 11/2/21 3:57 PM, Ali Çehreli wrote: const x = readln.strip; this is very interesting .`readln` then `strip;`,Very natural. Yes, UFCS (universal function call syntax) makes code natural, concise, and readable (but things can get out of hand :) ). Here is an example copied from the home page of dlang.org: import std.stdio, std.array, std.algorithm; void main() { stdin .byLineCopy .array .sort!((a, b) => a > b) // descending order .each!writeln; } Ali
Re: A problem in converting C code
On Tuesday, 2 November 2021 at 23:02:42 UTC, Ali Çehreli wrote: On 11/2/21 3:57 PM, Ali Çehreli wrote: const x = readln.strip; this is very interesting .`readln` then `strip;`,Very natural.
Re: A problem in converting C code
On Tuesday, 2 November 2021 at 23:02:42 UTC, Ali Çehreli wrote: On 11/2/21 3:57 PM, Ali Çehreli wrote: Here is a more idiomatic version: import std.stdio; import std.string; void main() { const x = strip(readln()); writeln(x); if (x == "hello world!") { writeln("yes"); } } The first line in main can be written with UFCS syntax as well: const x = readln.strip; Ali This is D point of view to the same classic C code. I think D has the spirit of C++.
Re: A problem in converting C code
On Tuesday, 2 November 2021 at 22:57:14 UTC, Ali Çehreli wrote: On 11/2/21 3:36 PM, pascal111 wrote: can we keep the C style of it as it is As you hint, this really is not D but still... :) I had to make three changes: import std.stdio; // Ali - Importing stdin under a different name // to prevent name conflict with std.stdio.stdin; import core.stdc.stdio : c_stdin = stdin; import core.stdc.string; int main() { // Ali - Changed the type to char[20] char[20] x; // Ali - The last parameter is the stream // to read from. fgets(&x[0],x.sizeof,stdin.getFP()); x[strcspn(&x[0],"\n")]=0; writeln(x); if(!strcmp(&x[0],"hello world!")) { writeln("yes"); } return 0; } Ali Yes, exactly, this is literal converting as most possibility.
Re: A problem in converting C code
On 11/2/21 3:57 PM, Ali Çehreli wrote: Here is a more idiomatic version: import std.stdio; import std.string; void main() { const x = strip(readln()); writeln(x); if (x == "hello world!") { writeln("yes"); } } The first line in main can be written with UFCS syntax as well: const x = readln.strip; Ali
Re: A problem in converting C code
On 11/2/21 3:36 PM, pascal111 wrote: can we keep the C style of it as it is As you hint, this really is not D but still... :) I had to make three changes: import std.stdio; // Ali - Importing stdin under a different name // to prevent name conflict with std.stdio.stdin; import core.stdc.stdio : c_stdin = stdin; import core.stdc.string; int main() { // Ali - Changed the type to char[20] char[20] x; // Ali - The last parameter is the stream // to read from. fgets(&x[0],x.sizeof,stdin.getFP()); x[strcspn(&x[0],"\n")]=0; writeln(x); if(!strcmp(&x[0],"hello world!")) { writeln("yes"); } return 0; } Ali
A problem in converting C code
In next program I intend it to be the D version of a C program, but I found some troubles with it, can we keep the C style of it as it is as we can and fix the must-be-fixed parts to make it works under D compiler? // D programming language import std.stdio; import core.stdc.stdio; import core.stdc.string; int main() { char x[20]; fgets(&x[0],x.sizeof,null); x[strcspn(&x[0],"\n")]=0; writeln(x); if(!strcmp(&x[0],"hello world!")) { writeln("yes"); } return 0; }