On 05/30/2015 12:19 PM, Dennis Ritchie wrote:

First, unfortunately, I don't understand you completely. Sorry about that... :)

Second, you can do almost anything with string mixins: Write a function that returns the code as string and just mix it in. :) Debug with pragma(msg):

string makeCode(string name)
{
    return `int ` ~ name ~ ` = 42;`;
}

unittest
{
    assert(makeCode("foo") == "int foo = 42;");
}

> I want to access the intermediate generation `range.front`. Is it
> possible? :)

Regarding that, the intermediate range.front is already available right before the .walk part. You can do anything at that point. There was some proposals about a 'tap' algorithm that could be used for debugging purposes. Here is a quick implementation:

import std.stdio, std.algorithm;

static int idx;

void walk(R)(R range) {
    while (!range.empty) {
        range.front;
        range.popFront;
    }
}

struct Tap(alias func, R)
{
    R range;

    alias range this;

    @property auto front()
    {
        func(range.front);
        return range.front;
    }
}

auto tap(alias func, R)(R range)
{
    return Tap!(func, R)(range);
}

void main() {
    [5, 6, 7]
        .map!(a => [idx++, a])
        .tap!((a) { writeln(a[1..$]); })  /* <-- This can use the
                                           * lambda syntax as well but
                                           * note that the return
                                           * value of the lambda is
                                           * ignored. So I think this
                                           * syntax is more
                                           * helpful. */
        .walk;
}

Ali

Reply via email to