Comment by messe

Comment by messe 17 hours ago

12 replies

Let me rephrase, you can't call it like any other function.

In Zig, a function that does IO can be called the same way whether or not it performs async operations or not. And if those async operations don't need concurrency (which Zig expresses separately to asynchronicity), then they'll run equally well on a sync Io runtime.

tcfhgj 17 hours ago

> In Zig, a function that does IO can be called the same way whether or not it performs async operations or not.

no, you can't, you need to pass a IO parameter

  • messe 17 hours ago

    You will need to pass that for synchronous IO as well. All IO in the standard library is moving to the Io interface. Sync and async.

    If I want to call a function that does asynchronous IO, I'll use:

       foo(io, ...);
    
    If I want to call one that does synchronous IO, I'll write:

        foo(io, ...);
    
    If I want to express that either one of the above can be run asynchronously if possible, I'll write:

        io.async(foo, .{ io, ... });
    
    If I want to express that it must be run concurrently, then I'll write:

        try io.concurrent(foo, .{ io, ... });
    
    Nowhere in the above do I distinguish whether or not foo does synchronous or asynchronous IO. I only mark that it does IO, by passing in a parameter of type std.Io.
    • tcfhgj 16 hours ago

      what about non-io code?

      • messe 16 hours ago

        What about it? It gets called without an Io parameter. Same way that a function that doesn't allocate doesn't get an allocator.

        I feel like you're trying to set me up for a gotcha "see, zig does color functions because it distinguishes functions that do io and those that don't!".

        And yes, that's true. Zig, at least Zig code using std, will mark functions that do Io with an Io parameter. But surely you can see how that will lead to less of a split in the ecosystem compared to sync and async rust?