From 8d051e2b6bc1b8014d782941fbacfd246ec88921 Mon Sep 17 00:00:00 2001 From: josh11b Date: Mon, 25 Oct 2021 13:05:39 -0700 Subject: [PATCH] Update constructor syntax (#913) --- docs/design/generics/details.md | 38 ++++++++++++++++----------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/design/generics/details.md b/docs/design/generics/details.md index cb33bb158e0b..f3c8eb74d2ba 100644 --- a/docs/design/generics/details.md +++ b/docs/design/generics/details.md @@ -224,10 +224,10 @@ class Point { impl as Vector { // In this scope, "Self" is an alias for "Point". fn Add[me: Self](b: Self) -> Self { - return Point(.x = a.x + b.x, .y = a.y + b.y); + return {.x = a.x + b.x, .y = a.y + b.y}; } fn Scale[me: Self](v: Double) -> Self { - return Point(.x = a.x * v, .y = a.y * v); + return {.x = a.x * v, .y = a.y * v}; } } } @@ -236,8 +236,8 @@ class Point { Interfaces that are implemented inline contribute to the type's API: ``` -var p1: Point = (.x = 1.0, .y = 2.0); -var p2: Point = (.x = 2.0, .y = 4.0); +var p1: Point = {.x = 1.0, .y = 2.0}; +var p2: Point = {.x = 2.0, .y = 4.0}; Assert(p1.Scale(2.0) == p2); Assert(p1.Add(p1) == p2); ``` @@ -263,7 +263,7 @@ meaning their data representations are the same, so we allow you to convert between the two freely: ``` -var a: Point = (.x = 1.0, .y = 2.0); +var a: Point = {.x = 1.0, .y = 2.0}; // `a` has `Add` and `Scale` methods: a.Add(a.Scale(2.0)); @@ -376,10 +376,10 @@ class Point2 { external impl Point2 as Vector { // In this scope, "Self" is an alias for "Point2". fn Add[me: Self](b: Self) -> Self { - return Point2(.x = a.x + b.x, .y = a.y + b.y); + return {.x = a.x + b.x, .y = a.y + b.y}; } fn Scale[me: Self](v: Double) -> Self { - return Point2(.x = a.x * v, .y = a.y * v); + return {.x = a.x * v, .y = a.y * v}; } } ``` @@ -409,7 +409,7 @@ On the other hand, if we convert to the facet type, those methods do become visible: ``` -var a: Point2 = (.x = 1.0, .y = 2.0); +var a: Point2 = {.x = 1.0, .y = 2.0}; // `a` does *not* have `Add` and `Scale` methods: // ❌ Error: a.Add(a.Scale(2.0)); @@ -435,14 +435,14 @@ class Point3 { var x: Double; var y: Double; fn Add[me: Self](b: Self) -> Self { - return Point3(.x = a.x + b.x, .y = a.y + b.y); + return {.x = a.x + b.x, .y = a.y + b.y}; } } -external Point3 as Vector { +external impl Point3 as Vector { alias Add = Point3.Add; // Syntax TBD fn Scale[me: Self](v: Double) -> Self { - return Point3(.x = a.x * v, .y = a.y * v); + return {.x = a.x * v, .y = a.y * v}; } } ``` @@ -482,8 +482,8 @@ _qualified name_, whether or not the implementation is done externally with an `external impl` statement: ``` -var p1: Point2 = (.x = 1.0, .y = 2.0); -var p2: Point2 = (.x = 2.0, .y = 4.0); +var p1: Point2 = {.x = 1.0, .y = 2.0}; +var p2: Point2 = {.x = 2.0, .y = 4.0}; Assert(p1.(Vector.Scale)(2.0) == p2); Assert(p1.(Vector.Add)(p1) == p2); ``` @@ -510,7 +510,7 @@ You could access `Draw` with a qualified name: import Plot; import Points; -var p: Points.Point2 = (.x = 1.0, .y = 2.0); +var p: Points.Point2 = {.x = 1.0, .y = 2.0}; p.(Plot.Drawable.Draw)(); ``` @@ -582,8 +582,8 @@ Even though `Point2` doesn't have `Add` and `Scale` methods, it still implements `Vector` and so can still call `AddAndScaleGeneric`: ``` -var a2: Point2 = (.x = 1.0, .y = 2.0); -var w2: Point2 = (.x = 3.0, .y = 4.0); +var a2: Point2 = {.x = 1.0, .y = 2.0}; +var w2: Point2 = {.x = 3.0, .y = 4.0}; var v3: Point2 = AddAndScaleGeneric(a, w, 2.5); ``` @@ -630,10 +630,10 @@ var VectorForPoint: Vector = { // `lambda` is **placeholder** syntax for defining a // function value. .Add = lambda(a: Point, b: Point) -> Point { - return Point(.x = a.x + b.x, .y = a.y + b.y); + return {.x = a.x + b.x, .y = a.y + b.y}; }, .Scale = lambda(a: Point, v: Double) -> Point { - return Point(.x = a.x * v, .y = a.y * v); + return {.x = a.x * v, .y = a.y * v}; }, }; ``` @@ -1518,7 +1518,7 @@ or using qualified names: adapter SongByTitle for Song { impl as Comparable { fn Less[me: Self](that: Self) -> bool { - return this.(Song.Title)() < that(Song.Title)(); + return this.(Song.Title)() < that.(Song.Title)(); } } }