Hi, this is one of my attempts to code in D:

Given a binary file, which contains pairs of a 4 byte integer and a zero-terminated string. The number of pairs is known. The task is to read the pairs, sort them by the integer ("id") part, and write out the result with line numbers to the console.

I tried to do this using the component paradigm, without extra classes, helper functions, etc. I've ended up with this code:

{
  uint count = 1000;

  auto f = File("binary.dat", "rb");

  uint id[1];
  int lineNo = 0;

  repeat(0, count).
  map!(t => tuple(f.rawRead(id)[0], f.readln('\0'))).
  array.
  sort!("a[0] < b[0]").
  map!(t => format("%6d %08x  %s\n", lineNo++, t[0], t[1])).
  copy(stdout.lockingTextWriter);

  stdout.flush();
}

Is this code "D-ish" enough?

There are things, I don'like here:

- the dummy repeat at the beginning of the component chain. The only purpose of it is to produce the needed number of items. Moreover repeat doesn't produce sortable range, so the array is needed as well. - I don't know how to do this when the number of items is nor known. How to repeat until EOF?
- The variables id, and lineNo outside the chain.
- rawRead() needs an array, even if there is only one item to read.
- How to avoid the flush() at the end?

What do you think?

Reply via email to