D for project in computational chemistry

Chris via Digitalmars-d digitalmars-d at puremagic.com
Tue Aug 4 02:48:05 PDT 2015


On Sunday, 2 August 2015 at 16:25:18 UTC, Yura wrote:
> Dear D coders/developers,
>
> I am just thinking on one project in computational chemistry, 
> and it is sort of difficult for me to pick up the right 
> language this project to be written. The project is going to 
> deal with the generation of the molecular structures and will 
> resemble to some extent some bio-informatic stuff. Personally I 
> code in two languages - Python, and a little bit in C (just 
> started to learn this language).
>
> While it is easy to code in Python there are two things I do 
> not like:
>
> 1) Python is slow for nested loops (much slower comparing to C)
> 2) Python is not compiled. However, I want to work with a code 
> which can be compiled and distributed as binaries (at least at 
> the beginning).
>
> When it comes to C, it is very difficult to code (I am a 
> chemist rather than computer scientist). The pointers, memory 
> allocation, absence of the truly dynamically allocated arrays, 
> etc, etc make the coding very long. C is too low level I 
> believe.
>
> I just wander how D would be suitable for my purpose? Please, 
> correct me if I am wrong, but in D the need of pointers is 
> minimal, there is a garbage collector, the arrays can be 
> dynamically allocated, the arrays can be sliced, ~=, etc which 
> makes it similar to python at some extent. I tried to write a 
> little code in D and it was very much intuitive and similar to 
> what I did both in Python and C.
>
> Any hints/thoughts/advises?
>
> With kind regards,
> Yury

I agree with bachmeier. You cannot go wrong. You mentioned nested 
loops. D allows you to concatenate (or "pipe") loops. So instead 
of

foreach
{
   foreach
   {
     foreach
     {
     }
   }
}

you have something like

int[] numbers = [-2, 1, 6, -3, 10];
foreach (ref n; numbers
   .map!(a => a * 5)  // multiply each value by 5
   .filter!(a => a > 0))  // filter values that are 0 or less
{
   //  Do something
}

or just write

auto result = numbers.map!(a => a * 5).filter!(a => a > 0);
// ==> result = [5, 30, 50]

You'd probably want to have a look at:

http://dlang.org/phobos/std_algorithm.html

and ranges (a very important concept in D):

http://ddili.org/ders/d.en/ranges.html
http://wiki.dlang.org/Component_programming_with_ranges

Excessive use of nested loops is not necessary in D nor is it 
very common. This makes the code easier to maintain and less 
buggy in the end.


More information about the Digitalmars-d mailing list