Re: A problem in converting C code

2021-11-02 Thread Ali Çehreli via Digitalmars-d-learn

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

2021-11-02 Thread zjh via Digitalmars-d-learn

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

2021-11-02 Thread pascal111 via Digitalmars-d-learn

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

2021-11-02 Thread pascal111 via Digitalmars-d-learn

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

2021-11-02 Thread Ali Çehreli via Digitalmars-d-learn

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

2021-11-02 Thread Ali Çehreli via Digitalmars-d-learn

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

2021-11-02 Thread pascal111 via Digitalmars-d-learn
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;
}