Quoting Kenton Varda (2019-06-26 07:13:03)

>    One thing that is part of that is making sure related declarations can
>    be grouped together, so that they can easily be read and digested
>    together, without scrolling back and forth. I'd say this is the main
>    motivation for nested declarations -- they can live next to the field
>    or method that references them, rather than far away at the global
>    scope.

One interesting approach that came to my head: you could allow
definitions to be syntactically nested in the schema (as they are now),
but not actually live in separate namespaces, so the generated code
could still have a flat namespace.  A bit non-intuitive, but otherwise
seems to combine the best of both worlds, and it wouldn't be hard for
the schema compiler to generate a clear and helpful error message in
the case of collisions of this sort.

> It's also the motivation for inlined method parameters and results,
> rather than requiring separate structs.

I'll grant there's a big readability drop in most cases with separate
structs; I'm not happy with the current trade-off, but I see the
argument.

> However, most of the multiple inheritance is to add persistence.

Furthermore, all of these are just declaring a one off interface like:

    interface PersistentFoo extends (Foo, SystemPersistent) {}

Which is not used anywhere else in the schema, and has no methods of its
own nor any meaningful semantics except for adding persistence to
another interface.

I imagine the reason for all of these is just that (as I understand it),
the C++ implementation doesn't provide any way to export a capability
that implements disjoint interfaces -- you need to have a common
subtype. I think these interfaces are really C++ implementation detail
unnecessarily leaking back into the schema definitions, making them less
declarative.

I suspect there is a better solution to be found involving direct
support for exporting disjoint method sets. You can do this with
the Go implementation, but it's a little non-obvious; see:

    https://github.com/capnproto/go-capnproto2/issues/86

..and:

    
https://github.com/zenhack/sandstorm-filesystem/blob/master/filesystem/local/local.go#L231-L249

> I also expect that there are features other that persistence which
> might be similarly orthogonal to business logic, which people will
> want the ability to mix-in in a similar way.

This is a plausible argument, but I am dubious of including features
with demonstrable downsides on the basis of somewhat vague, so far
purely hypothetical use cases.

-Ian

-- 
You received this message because you are subscribed to the Google Groups 
"Cap'n Proto" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to capnproto+unsubscr...@googlegroups.com.
Visit this group at https://groups.google.com/group/capnproto.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/capnproto/156169027156.2272.8193064500905449301%40localhost.localdomain.

Reply via email to