Thread overview
A problem in converting C code
Nov 02, 2021
pascal111
Nov 02, 2021
Ali Çehreli
Nov 02, 2021
Ali Çehreli
Nov 02, 2021
pascal111
Nov 03, 2021
zjh
Nov 03, 2021
Ali Çehreli
Nov 02, 2021
pascal111
November 02, 2021

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;
}

November 02, 2021
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
November 02, 2021
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

November 02, 2021
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.
November 02, 2021
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++.
November 03, 2021

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.

November 02, 2021
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