D vs Go in real life

Chris wendlec at tcd.ie
Fri Nov 29 04:06:15 PST 2013


On Friday, 29 November 2013 at 08:29:04 UTC, Bienlein wrote:
> On Thursday, 28 November 2013 at 19:22:06 UTC, Andrei 
> Alexandrescu wrote:
>
>> Interesting. Could you please create a paste with the two code 
>> samples?
>>
>> Thanks,
>>
>> Andrei
>
> Hello,
>
> here is the Go code:
>
> package main
>
> import (
> 	"fmt"
> )
>
> type Point struct {
> 	x, y int
> }
>
> type Rectangular struct {
> 	topLeft, bottomRight Point
> }
>
> func (self Rectangular) Left() int {
> 	return self.topLeft.x
> }
>
> func (self Rectangular) Right() int {
> 	return self.bottomRight.x
> }
>
> func (self Rectangular) Width() int {
> 	return self.Right() - self.Left()
> }
>
> type Rectangle struct {
> 	Rectangular
> }
>
> func NewRectangle(topLeft, bottomRight Point) *Rectangle {
> 	rectangle := new(Rectangle)
> 	rectangle.Rectangular.topLeft = topLeft
> 	rectangle.Rectangular.bottomRight = bottomRight
> 	return rectangle
> }
>
> func main() {
> 	rectangle := NewRectangle(Point{1, 2}, Point{12, 2})
> 	fmt.Println(rectangle.Width())
> }
>
> And this is the Scala code:
>
> import java.awt.Point
>
> trait Rectangular {
>
>   protected val topLeft: Point
>   protected val bottomRight: Point
>
>   def width : Int = bottomRight.x - topLeft.x
> }
>
> class Rectangle(val topLeft: Point, val bottomRight: Point) 
> extends Rectangular
>
> object RunIt extends Application {
>
>   val rectangle = new Rectangle(new Point(1, 2), new Point(12, 
> 2))
>   println(rectangle.width)
>
> }
>
> I guess in D you would do something like this:
>
> mixin template Rectangular() {
>   Point x, y;
> }
>
> mixin Rectangular;
>
> struct Rectangle {
>   mixin Rectangular;
> }
>
>
> Note that in the Scala code Rectangular.topLeft and 
> Rectangular.bottomRight are protected. Since the solution in Go 
> makes use of delegation this can only be accomplished in Go 
> through making getters public or defining Rectangle in the same 
> package as Rectangular. Since Go does not have constructors the 
> way to initialize a Rectangle in Go looks more clumsy.
>
> An interesting point to me is that Rectangular in Go is just an 
> ordinary struct whereas Rectangular is a special construct in 
> Scala (being a trait) and in D (being a mixin). So Scala and D 
> force you to design ahead, e.g. you have to decide in advance 
> whether to make Rectangular a trait or mixin. Thereafter, 
> Rectangular is not of use on its own, only when used as a trait 
> or mixin.
>
> What makes me think is whether delegation as a language 
> construct has been underrated and whether Go now makes this 
> obvious.
>
> -- Bienlein

Thanks for the example. To be honest the Go code looks like a 
glorified version of JavaScript to me. I think it is way too 
"obfuscated", and Go syntax seems a bit like someone _always_ 
wanted to do it differently, just a personal preference, no 
matter what people intuitively expect.[1]

x, y int

I prefer left-to-right:

"type integer named x (or whatever)", i.e. int x;

But why on earth (a []byte)? The type is important, not the name. 
I can give it any name. a, inComing, inBytes, response, 
draculaBytes ...

[1] Raises the question whether we've been conditioned by C or 
whether C was intuitive.


More information about the Digitalmars-d mailing list