Skip to content

Commit 9ca016e

Browse files
authored
Merge pull request #6625 from dotty-staging/add-scala-days-blogpost
Add blogpost for 0.16.0-RC3 and 0.15.0 - (Scala Days Release)
2 parents 5188531 + db6cda0 commit 9ca016e

File tree

2 files changed

+252
-0
lines changed

2 files changed

+252
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,252 @@
1+
---
2+
layout: blog-page
3+
title: Announcing Dotty 0.16.0-RC3 – the Scala Days 2019 Release
4+
author: Aggelos Biboudis and Anatolii Kmetiuk
5+
date: 2019-06-11
6+
---
7+
8+
Hello again! Today, we are excited to announce the 16th release of Dotty. The
9+
development of Dotty continues according to our schedule but today, Tuesday June
10+
the 11th, we are electrified as it is the first day of [Scala Days 2019](https://scaladays.org/)
11+
which marks the *10th* anniversary of Scala Days.
12+
With this release we are getting closer to the _envelope_ of the new features
13+
that Dotty plans to offer.
14+
15+
![]({{ site.baseurl }}/images/others/scala-days-logo.png "Scala Days 2019")
16+
17+
This release serves as a technology preview that demonstrates new
18+
language features and the compiler supporting them.
19+
20+
Dotty is the project name for technologies that are being considered for
21+
inclusion in Scala 3. Scala has pioneered the fusion of object-oriented and
22+
functional programming in a typed setting. Scala 3 will be a big step towards
23+
realising the full potential of these ideas. Its main objectives are to
24+
25+
- become more opinionated by promoting programming idioms we found to work well,
26+
- simplify where possible,
27+
- eliminate inconsistencies and surprising behaviours,
28+
- build on strong foundations to ensure the design hangs together well,
29+
- consolidate language constructs to improve the language’s consistency, safety, ergonomics, and
30+
performance.
31+
32+
You can learn more about Dotty on our [website](https://dotty.epfl.ch).
33+
34+
<!--more-->
35+
36+
This is our 16th scheduled release according to our
37+
[6-week release schedule](https://dotty.epfl.ch/docs/contributing/release.html).
38+
39+
# What’s new in the 0.16.0-RC3 technology preview?
40+
41+
<!-- https://github.com/lampepfl/dotty/pulls?q=is%3Apr+closed%3A%3E2019-05-23+is%3Aclosed+sort%3Acomments-desc -->
42+
43+
## Syntax Change: Type Lambdas
44+
45+
We reconsider the syntax of type lambdas in an effort to provide an improved
46+
visual cue for two categories of types: types that relate to normal function
47+
types and types that operate on a higher level. The _fat_ arrow `=>` definitely
48+
relates to the first, while we reserve now `->` to mean _pure function_ in the
49+
future. As a result, we disengage `=>` from type lambdas, which are now
50+
represented by `=>>`. As a result a function from types to types is written as
51+
`[X] =>> F[X]`.
52+
53+
For those who are interested in the discussions,
54+
[#6558](https://github.com/lampepfl/dotty/pull/6558) introduced the new syntax.
55+
56+
## Syntax Change: Wildcard Arguments in Types
57+
58+
The syntax of wildcard arguments in types has changed from `_` to `?`. Example:
59+
60+
```scala
61+
List[?]
62+
Map[? <: AnyRef, ? >: Null]
63+
```
64+
65+
Again, in an effort to fine-tune our syntax we put two features, from the world
66+
of terms and types, side-by-side and drew parallels at the syntactic level.
67+
Consequently, as `f(_)` is a shorthand for the lambda `x => f(x)` and as we plan
68+
ahead for making `C[_]` to be a shorthand for the type lambda `[X] =>> C[X]` in
69+
the future we pick `?` as a replacement syntax for wildcard types, since it
70+
aligns with Java's syntax.
71+
72+
For more information please read our documentation on
73+
[Wildcards](https://dotty.epfl.ch/docs/reference/changed-features/wildcards.html).
74+
75+
# Syntax Change: Contextual Abstractions
76+
77+
We reconsider the syntax for contextual abstractions introducing `delegates`
78+
(formerly known as `implied`). `delegate`, in the context of contextual
79+
abstraction means that we declare a _representative of a type_. We use
80+
`delegate` as a noun. Note that this change is solely syntactical/grammatical
81+
and its motivation is to give a clearer meaning to those _canonical_ values of
82+
certain types (like `Ord[Int]`), that serve for synthesizing arguments to
83+
`given` clauses.
84+
85+
```scala
86+
delegate IntOrd for Ord[Int] {
87+
def compare(x: Int, y: Int) =
88+
if (x < y) -1 else if (x > y) +1 else 0
89+
}
90+
```
91+
92+
```scala
93+
delegate ListOrd[T] for Ord[List[T]] given (ord: Ord[T]) {
94+
```
95+
96+
For more information, the documentation has been updated as part of the relevant
97+
PR [#6649](https://github.com/lampepfl/dotty/pull/6649)
98+
99+
## Polymorphic function types
100+
101+
We add preliminary support for _polymorphic function types_. Nowadays, when we
102+
want to write a universally quantified function over elements of lists of type
103+
`T` we write e.g., `List[T] => List[(T, T)]` where `T` is bound at an enclosing
104+
definition. With polymorphic function types (PFT hereafter) we can quantify the
105+
parametric type locally. For example:
106+
107+
```scala
108+
[T <: AnyVal] => List[T] => List[(T, T)]
109+
```
110+
111+
As you notice, this gives us the ability to impose restrictions on the type
112+
variable `T` locally. Assume, you have an identity function with `type id = T => T`.
113+
By writing it as `type id = [T] => T => T` we abstract further the concept
114+
of a _polymorphic function_ and make it a *true* _family of functions_.
115+
116+
The code below (correctly) fails to type check because `T` needs to be bounded
117+
in the enclosing class:
118+
119+
```scala
120+
val id: T => T = t => t
121+
println(s"${id(1)} , ${id(7.0d)}")
122+
```
123+
124+
With PFTs we can now achieve what we want:
125+
126+
```scala
127+
val id = [T] => (t: T) => t
128+
println(s"${id(1)} , ${id(7.0d)}")
129+
```
130+
131+
For those who are interested in the discussions and more test cases,
132+
[#4672](https://github.com/lampepfl/dotty/pull/4672/) introduced PFTs.
133+
134+
## lazy vals are now thread-safe by default
135+
136+
Previously thread-safety was required using `@volatile` but that would not be
137+
consistent with Scala 2. The old behavior of non-volatile lazy vals can be
138+
recovered by using the newly-introduced `@threadUnsafe`.
139+
140+
For more information please read our documentation on the
141+
[threadUnsafe annotation](https://dotty.epfl.ch/docs/reference/other-new-features/threadUnsafe-annotation.html).
142+
143+
## Introducing `for` clauses for importing delegate imports by type
144+
145+
Since delegate instances can be anonymous it is not always practical to import
146+
them by their name, and wildcard imports are typically used instead. By-type
147+
imports provide a more specific alternative to wildcard imports, which makes it
148+
clearer what is imported. Example:
149+
150+
```scala
151+
import delegate A.{for TC}
152+
```
153+
154+
This imports any delegate instance in `A` that has a type which conforms tp `TC`.
155+
There can be several bounding types following a `for` and bounding types can
156+
contain wildcards.
157+
For instance, assuming the object
158+
159+
```scala
160+
object Delegates {
161+
delegate intOrd for Ordering[Int]
162+
delegate [T: Ordering] listOrd for Ordering[List[T]]
163+
delegate ec for ExecutionContext = ...
164+
delegate im for Monoid[Int]
165+
}
166+
```
167+
the import
168+
```
169+
import delegate Delegates.{for Ordering[_], ExecutionContext}
170+
```
171+
would import the `intOrd`, `listOrd`, and `ec` instances but leave out the `im`
172+
instance, since it fits none of the specified bounds.
173+
174+
## New typeclass derivation scheme
175+
176+
Summary of measured differences with the old scheme:
177+
178+
- About 100 lines more compiler code - the rest of the lines changed diff is
179+
tests.
180+
- About 13-15% more code generated for typeclass instances
181+
- About 3-4% slower to compile typeclass instances
182+
183+
Advantages of new scheme:
184+
185+
- Fewer allocations, since mirrors (`Generic` has been renamed to `Mirror`) are
186+
usually shared instead of being allocated at runtime.
187+
- It works well even if there are no derives clauses. The old scheme would
188+
generate more code in that case.
189+
- Complete decoupling between derives clauses and mirror generation.
190+
191+
For the technical details of these changes please consule the corresponding PR
192+
[#6531](https://github.com/lampepfl/dotty/pull/6531).
193+
194+
# Let us know what you think!
195+
196+
If you have questions or any sort of feedback, feel free to send us a message on our
197+
[Gitter channel](https://gitter.im/lampepfl/dotty). If you encounter a bug, please
198+
[open an issue on GitHub](https://github.com/lampepfl/dotty/issues/new).
199+
200+
## Contributing
201+
202+
Thank you to all the contributors who made this release possible!
203+
204+
According to `git shortlog -sn --no-merges 0.15.0-RC1..0.16.0-RC3` these are:
205+
206+
```
207+
88 Martin Odersky
208+
51 Anatolii
209+
48 Nicolas Stucki
210+
26 Guillaume Martres
211+
21 Miles Sabin
212+
19 Liu Fengyun
213+
12 Aleksander Boruch-Gruszecki
214+
11 Sébastien Doeraene
215+
8 Aggelos Biboudis
216+
4 Olivier Blanvillain
217+
3 Eugene Yokota
218+
1 Dale Wijnand
219+
1 Allan Renucci
220+
1 Olivier ROLAND
221+
```
222+
223+
If you want to get your hands dirty and contribute to Dotty, now is a good time to get involved!
224+
Head to our [Getting Started page for new contributors](https://dotty.epfl.ch/docs/contributing/getting-started.html),
225+
and have a look at some of the [good first issues](https://github.com/lampepfl/dotty/issues?q=is%3Aissue+is%3Aopen+label%3Aexp%3Anovice).
226+
They make perfect entry points into hacking on the compiler.
227+
228+
We are looking forward to having you join the team of contributors.
229+
230+
## Library authors: Join our community build
231+
232+
Dotty now has a set of widely-used community libraries that are built against every nightly Dotty
233+
snapshot. Currently this includes ScalaPB, algebra, scalatest, scopt and squants.
234+
Join our [community build](https://github.com/lampepfl/dotty-community-build)
235+
to make sure that our regression suite includes your library.
236+
237+
[Scastie]: https://scastie.scala-lang.org/?target=dotty
238+
239+
[@odersky]: https://github.com/odersky
240+
[@DarkDimius]: https://github.com/DarkDimius
241+
[@smarter]: https://github.com/smarter
242+
[@felixmulder]: https://github.com/felixmulder
243+
[@nicolasstucki]: https://github.com/nicolasstucki
244+
[@liufengyun]: https://github.com/liufengyun
245+
[@OlivierBlanvillain]: https://github.com/OlivierBlanvillain
246+
[@biboudis]: https://github.com/biboudis
247+
[@allanrenucci]: https://github.com/allanrenucci
248+
[@Blaisorblade]: https://github.com/Blaisorblade
249+
[@Duhemm]: https://github.com/Duhemm
250+
[@AleksanderBG]: https://github.com/AleksanderBG
251+
[@milessabin]: https://github.com/milessabin
252+
[@anatoliykmetyuk]: https://github.com/anatoliykmetyuk
340 KB
Loading

0 commit comments

Comments
 (0)