← Back to context

Comment by sirwhinesalot

6 months ago

You deal with those the same way you deal with them in any language without RAII, some sort of try-with-resource block or defer.

Not making a value judgment if that is better or worse than RAII, just pointing out that resources of different kinds don't have to be handled by the same mechanism. This blog post is about memory management in C3. Other resource management is already handled by defer.

Why would you treat the two differently, though? What benefit does it bring? (defer is such an ugly, manual solution in general; it becomes very cumbersome once you may want to give control of the resource to anyone else.)

  • Well, the answer is obvious in garbage collected languages: because a GC excels at managing memory but sucks at managing other resources.

    Here, the answer is that ownership semantics are disliked by the language designer (doesn't fit the design goals), so they're not in the language.

    • Not really obvious, given that there are garbage collected languages with RAII, like D, to quote one example.

      And even stuff like try/using/with can be made RAII alike, via static analysis, which defer like approaches usually can't, because it can be any expression type, unlike those other approaches that rely on specific interfaces/magic methods being present, thus can be tracked via the type system.

      So it can be turned into a compiler error if such tagged type doesn't escape lexical scope without calling the respective try/using/with on the variable declaration.

      2 replies →