5 ms·
"The strange alias _curr this is a lovely feature of D known as subtyping. It basically means that any property that doesn't exist at the struct's scope will we
by charlieflowers 12y ago
"The strange alias _curr this is a lovely feature of D known as subtyping. It basically means that any property that doesn't exist at the struct's scope will we forwarded to _curr, e.g., when I write myCtx.foo and myCtx has no member named foo, the code is rewritten as myCtx._curr.foo."
That's a great feature. I don't see many languages investing enough focus into this kind of "delegation wiring."
- 4ad 12y agoGo has something similar, but it's implicit with type embedding, you don't have to explicitly alias anything; also the Plan 9 C dialect has it too (and was used extensively in the Go runtime until recently). One nice idiom in Plan 9 is to be able to call Lock on various structures that embed a lock.
- p0nce 12y agoCan you give a code example in Go?
- cjslep 12y agoQuick example on the playground, if this is what you were asking about: http://play.golang.org/p/zShJKp0t3n http://play.golang.org/p/zShJKp0t3n
- eco 12y agoSo subtyping automatically happens for all members of a struct? I'm not sure I like that but I guess I'd have to see how well it works in practice.
- 4ad 12y agoNo, it only happens if you embed the type, a.i. the member is anonymous. http://golang.org/doc/effective_go.html#embedding http://golang.org/doc/effective_go.html#embedding http://golang.org/ref/spec#Struct_types http://golang.org/ref/spec#Struct_types Note that there's also interface embedding which is a different thing.
- eco 12y agoAh, that makes a lot more sense. Thank you for explaining.
- 4ad 12y agohttp://play.golang.org/p/Vl9XzK3hOS http://play.golang.org/p/Vl9XzK3hOS
- p0nce 12y agoInteresting but this is not the same feature. Go implements what seems like multiple inheritance, D simply dispatch calls to a member, which can be a pointer to T instead of T. So you can implement custom pointer types.
- 4ad 12y agoI have provided a better example: http://play.golang.org/p/yYg8okmN6a http://play.golang.org/p/yYg8okmN6a Yes, it's a different feature, but is not multiple inheritance either (although I understand why, at a first glance, you'd think it would seems like that). It's just composition. In this new example, look how you can do b.myInt, even though b is now a bar, not a foo. In fact this happened in the old example too, but it was invisible. This is how the Lock function accessed the mutex.
- jeremiep 12y agoI love this feature! It's also recursive, you can have the following: struct A { int a; alias a this; } struct B { A a; alias a this; } struct C { B b; alias b this; } static assert(C(42) == 42); Combined with D's support for compile-time protocols, this allows for some very expressive, powerful and lighting fast code.
- simias 12y agoIf I understand correctly you can achieve something similar in many other languages by implementing a dereference operator. You'll have to be explicit when you use the object though (o.foo vs. o->foo for instance). I tend to prefer these kinds of explicit constructs over compiler magic, but it's a matter of taste really.
- quatrevingts 12y agoThe built-in version has the big advantage that it integrates well with tools: you can statically determine the target of the reference and jump to it.
- justincormack 12y agoLua metatables do that.
- WalterBright 12y agoYes. It makes it easy to do things like, for example, create your own "int" type without having to duplicate all the behaviors of int. Just override the behaviors you'd like to change, then forward the rest to the wrapped int field.