Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions _posts/2013-01-27-elixir-v0-8-0-released.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ String.capitalize("fiN") #=> "Fin"

The example above contains a string with only two codepoints, [the codepoint fi](http://www.fileformat.info/info/unicode/char/FB01/index.htm) and [the codepoint n](http://www.fileformat.info/info/unicode/char/006E/index.htm). Look how Elixir properly capitalizes the string, returning a new string made of three codepoints (all ascii letters).

Learn more about [Unicode support with the String module](/docs/stable/elixir/String.html).
Learn more about [Unicode support with the String module](/docs/stable/elixir/#!String.html).

## AST metadata

Expand Down Expand Up @@ -70,11 +70,11 @@ When some code call the `unless` macro above, in previous Elixir versions, it wo

Elixir v0.8 ensures that the `unless` macro above will expand to the same `if` macro available when quoted, guaranteeing different libraries can integrate easily without imposing hidden requirements.

You can read more about [macros in the getting started guide](/getting-started/case-cond-and-if.html) or [go deep into the quote macro docs](/docs/stable/elixir/Kernel.SpecialForms.html#quote/2).
You can read more about [macros in the getting started guide](/getting-started/case-cond-and-if.html) or [go deep into the quote macro docs](/docs/stable/elixir/#!Kernel.SpecialForms.html#quote/2).

## A new way to manipulate pathnames

Elixir v0.8 contains a bit of house cleaning too. We have created [the Path module](/docs/stable/elixir/Path.html) to accommodate functions used to manipulate filesystem paths and have also added functions like [`System.tmp_dir` and `System.user_home`](/docs/stable/elixir/System.html) which are meant to work accross different operating systems and are very handy when scripting.
Elixir v0.8 contains a bit of house cleaning too. We have created [the Path module](/docs/stable/elixir/#!Path.html) to accommodate functions used to manipulate filesystem paths and have also added functions like [`System.tmp_dir` and `System.user_home`](/docs/stable/elixir/#!System.html) which are meant to work accross different operating systems and are very handy when scripting.

## The new HashDict

Expand Down
2 changes: 1 addition & 1 deletion _posts/2013-04-29-elixir-v0-8-2-released.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,6 @@ defmodule MathTest do
end
```

You can learn more about [doctests on our documentation page](/docs/stable/ex_unit/ExUnit.DocTest.html) and get more information about our latest release [on the CHANGELOG](https://github.com/elixir-lang/elixir/blob/ed27611f48ba150404c95fe15f1d6058a4287330/CHANGELOG.md).
You can learn more about [doctests on our documentation page](/docs/stable/ex_unit/#!ExUnit.DocTest.html) and get more information about our latest release [on the CHANGELOG](https://github.com/elixir-lang/elixir/blob/ed27611f48ba150404c95fe15f1d6058a4287330/CHANGELOG.md).

If you are new to Elixir, [it's easy to get started with](/getting-started/introduction.html)!
2 changes: 1 addition & 1 deletion _posts/2013-05-23-elixir-v0-9-0-released.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ A special thanks to [Eric Meadows-Jonsson](https://github.com/ericmj) for implem
We have also many other smaller improvements:

* Our CLI now supports `--hidden` and `--cookie` flags which are useful for distributed modes;
* Our test framework, ExUnit, is now able to capture all the communication that happens with a registed IO device, like `:stdio` and `:stderr`, via [`ExUnit.CaptureIO`](/docs/stable/ex_unit/ExUnit.CaptureIO.html). This is very useful for testing how your software reacts to some inputs and what it prints to the terminal;
* Our test framework, ExUnit, is now able to capture all the communication that happens with a registed IO device, like `:stdio` and `:stderr`, via [`ExUnit.CaptureIO`](/docs/stable/ex_unit/#!ExUnit.CaptureIO.html). This is very useful for testing how your software reacts to some inputs and what it prints to the terminal;
* `IEx` now allows files to be imported into the shell with `import_file` and also loads `~/.iex` on startup for custom configuration;
* The `String`, `Enum` and `Dict` modules got more convenience functions that goes from checking unicode character validity to taking values out of a dictionary;
* And many, many more!
Expand Down
8 changes: 4 additions & 4 deletions _posts/2013-07-13-elixir-v0-10-0-released.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -54,19 +54,19 @@ Stream.repeatedly(fn -> :random.uniform end) |> Enum.take(3)
#=> [0.4435846174457203, 0.7230402056221108, 0.94581636451987]
```

`Stream.repeatedly/1` returns an infinite stream but that's ok we just need its first three elements. You can learn more about [stream and related functions in `Stream` module documentation](/docs/stable/elixir/Stream.html).
`Stream.repeatedly/1` returns an infinite stream but that's ok we just need its first three elements. You can learn more about [stream and related functions in `Stream` module documentation](/docs/stable/elixir/#!Stream.html).

## Sets

This release also adds [the Sets API](/docs/stable/elixir/Set.html) to Elixir and a HashSet implementation. The HashSet implementation follows [the same design goals as the HashDict implementation](/blog/2013/01/27/elixir-v0-8-0-released/) released at the beginning of this year, starting with a compact representation and expanding and contracting as needed.
This release also adds [the Sets API](/docs/stable/elixir/#!Set.html) to Elixir and a HashSet implementation. The HashSet implementation follows [the same design goals as the HashDict implementation](/blog/2013/01/27/elixir-v0-8-0-released/) released at the beginning of this year, starting with a compact representation and expanding and contracting as needed.

This feature was a contribution from [Joseph Wilk](https://github.com/josephwilk) and he talks about its implementation and provides some benchmarks [on his blog](http://blog.josephwilk.net/elixir/sets-in-elixir.html).

## Pretty printing

Another addition to this release is pretty printing. The pretty printing started as an implementation of the [Wadler paper](http://homepages.inf.ed.ac.uk/wadler/papers/prettier/prettier.pdf) by [Jonns Mostovoys](https://github.com/manpages) which was then improved by [Gustavo Brunoro](https://github.com/brunoro) under his Google Summer of Code project as described in [Lindig's _Strictly Prettier_ paper](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.34.2200).

As soon as you upgrade to Elixir v0.10.0 and start IEx, you will get pretty printing for all data structures provided by Elixir. We have also added documentation to the `Inspect` module about [adding pretty printing to your own structures](/docs/stable/elixir/Inspect.html) as well as [using the document algebra for any other kind of formatting](/docs/stable/elixir/Inspect.Algebra.html).
As soon as you upgrade to Elixir v0.10.0 and start IEx, you will get pretty printing for all data structures provided by Elixir. We have also added documentation to the `Inspect` module about [adding pretty printing to your own structures](/docs/stable/elixir/#!Inspect.html) as well as [using the document algebra for any other kind of formatting](/docs/stable/elixir/#!Inspect.Algebra.html).

## Other improvements

Expand All @@ -78,7 +78,7 @@ Other notable improvements are:

* We are also working hard on Windows support, improving its command-line tools and working towards a green test suite, thanks to [Tom Jansens](https://github.com/tojans);

* Meta-programming in Elixir was also improved by the addition of the `binding/0` and `binding/1` macros plus the additions of `Macro.expand_once/2` and `Macro.expand_all/2` to the [`Macro` module](/docs/stable/elixir/Macro.html);
* Meta-programming in Elixir was also improved by the addition of the `binding/0` and `binding/1` macros plus the additions of `Macro.expand_once/2` and `Macro.expand_all/2` to the [`Macro` module](/docs/stable/elixir/#!Macro.html);

There are also improvements to typespecs, error messages, many bug fixes and some backwards incompatible changes. We have posted a detailed [upgrade instructions on the mailing list](https://groups.google.com/forum/?fromgroups#!topic/elixir-lang-talk/ksrefrgK1eY). For a general overview, [check out the CHANGELOG](https://github.com/elixir-lang/elixir/blob/v0.10.0/CHANGELOG.md).

Expand Down
4 changes: 2 additions & 2 deletions _posts/2013-08-08-elixir-design-goals.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -202,9 +202,9 @@ Enum.map set, fn(x) -> x * 2 end
#=> [2,4,6]
```

Not only that, any developer can **extend** the `Enum` module to work with any data type as long as the data type implements [the `Enumerable` protocol](/docs/stable/elixir/Enumerable.html) (protocols in Elixir are based on Clojure's protocol). This is extremely convenient because the developer needs to know only the `Enum` API for enumeration, instead of memorizing specific APIs for sets, lists, dicts, etc.
Not only that, any developer can **extend** the `Enum` module to work with any data type as long as the data type implements [the `Enumerable` protocol](/docs/stable/elixir/#!Enumerable.html) (protocols in Elixir are based on Clojure's protocol). This is extremely convenient because the developer needs to know only the `Enum` API for enumeration, instead of memorizing specific APIs for sets, lists, dicts, etc.

There are many other protocols exposed by the language, like [the `Inspect` protocol](/docs/stable/elixir/Inspect.html) for pretty printing data structures and [the `Access` protocol](/docs/stable/elixir/Access.html) for accessing key-value data by key. By being extensible, Elixir ensures developers can work **with** the language, instead of **against** the language.
There are many other protocols exposed by the language, like [the `Inspect` protocol](/docs/stable/elixir/#!Inspect.html) for pretty printing data structures and [the `Access` protocol](/docs/stable/elixir/#!Access.html) for accessing key-value data by key. By being extensible, Elixir ensures developers can work **with** the language, instead of **against** the language.

## Summing up

Expand Down
6 changes: 3 additions & 3 deletions _posts/2013-11-05-elixir-v0-11-0-released.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ In this new release, IEx also supports a very simple debugging mechanism called

![IEx pry example](/images/contents/iex-pry.png)

In Elixir, your code runs in many processes that talk to each other and the Elixir shell is no different. `IEx.pry` allows another process to take over the shell, allowing the developer to inspect the binding and halt the execution of the process being "pried" (i.e. the one that invoked `IEx.pry`). We called this feature `pry` as a gentle reminder that you can only inspect existing information, you cannot change the binding over a pried process. For more information, check the docs for [`IEx.pry/1`](/docs/stable/iex/IEx.html#pry/1).
In Elixir, your code runs in many processes that talk to each other and the Elixir shell is no different. `IEx.pry` allows another process to take over the shell, allowing the developer to inspect the binding and halt the execution of the process being "pried" (i.e. the one that invoked `IEx.pry`). We called this feature `pry` as a gentle reminder that you can only inspect existing information, you cannot change the binding over a pried process. For more information, check the docs for [`IEx.pry/1`](/docs/stable/iex/#!IEx.html#pry/1).

## ExUnit

Expand Down Expand Up @@ -59,9 +59,9 @@ fun.(1..3)
#=> true
```

You can learn more about the [new capture operator in our docs](/docs/stable/elixir/Kernel.SpecialForms.html#&/1).
You can learn more about the [new capture operator in our docs](/docs/stable/elixir/#!Kernel.SpecialForms.html#&/1).

We have also pushed improvements to [the String module](/docs/stable/elixir/String.html), including new APIs. In particular, in order to know that `String.length("josé")` has length 4 (even though it takes 5 bytes to be represented in UTF-8), we need to use some algorithms defined by the Unicode Standard. These have been implemented as specified in the [extended grapheme cluster algorithm, defined in the version 6.3.0 of the Unicode Standard](http://www.unicode.org/reports/tr29/).
We have also pushed improvements to [the String module](/docs/stable/elixir/#!String.html), including new APIs. In particular, in order to know that `String.length("josé")` has length 4 (even though it takes 5 bytes to be represented in UTF-8), we need to use some algorithms defined by the Unicode Standard. These have been implemented as specified in the [extended grapheme cluster algorithm, defined in the version 6.3.0 of the Unicode Standard](http://www.unicode.org/reports/tr29/).

In the optimization front, we have pushed the first iteration of a [feature called Protocol consolidation](https://groups.google.com/forum/#!topic/elixir-lang-core/RoXAUtoyjk4), which speeds up the polymorphic dispatch done by protocols, sometimes reducing the dispatching time to 10% of the original time. We will continue working in upcoming releases to integrate protocol consolidation as a regular part of the developer workflow.

Expand Down
12 changes: 6 additions & 6 deletions _posts/2014-04-21-elixir-v0-13-0-released.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,11 @@ In a nutshell, here is what new:

* The [Getting Started guide](/getting-started/introduction.html) was rewritten from scratch. The previous guide was comprised of 7 chapters and was about to become 2 years old. The new guide features 20 chapters, it explores the new maps and structs (which are part of this release), and it goes deeper into topics like IO and File handling. It also includes an extra guide, still in development, about [Meta-Programming in Elixir](/getting-started/meta/quote-and-unquote.html);

* Elixir v0.13 provides a new comprehension syntax that not only works with lists, but with any [`Enumerable`](/docs/stable/elixir/Enumerable.html). The output of a comprehension is also extensible via the [`Collectable`](/docs/stable/elixir/Collectable.html) protocol;
* Elixir v0.13 provides a new comprehension syntax that not only works with lists, but with any [`Enumerable`](/docs/stable/elixir/#!Enumerable.html). The output of a comprehension is also extensible via the [`Collectable`](/docs/stable/elixir/#!Collectable.html) protocol;

* Mix, Elixir's build tool, has been improved in order to provide better workflows when compiling projects and working with dependencies;

* There are many other changes, like the addition of [StringIO](/docs/stable/elixir/StringIO.html), support for [tags and filters in ExUnit](/docs/stable/ex_unit/ExUnit.Case.html) and more. Please check the [CHANGELOG](https://github.com/elixir-lang/elixir/blob/v0.13.0/CHANGELOG.md) for the complete list.
* There are many other changes, like the addition of [StringIO](/docs/stable/elixir/#!StringIO.html), support for [tags and filters in ExUnit](/docs/stable/ex_unit/#!ExUnit.Case.html) and more. Please check the [CHANGELOG](https://github.com/elixir-lang/elixir/blob/v0.13.0/CHANGELOG.md) for the complete list.

Even with all those improvements, Elixir v0.13.0 is backwards compatible with Elixir v0.12.5 and upgrading should be a clean process.

Expand Down Expand Up @@ -68,7 +68,7 @@ iex> %{"other" => value} = map

A map pattern will match any map that has all the keys specified in the pattern. The values for the matching keys must also match. For example, `%{"hello" => world}` will match any map that has the key `"hello"` and assign the value to `world`, while `%{"hello" => "world"}` will match any map that has the key `"hello"` with value equals to `"world"`. An empty map pattern (`%{}`) will match all maps.

Developers can use the functions in the [`Map` module](/docs/stable/elixir/Map.html) to work with maps. For more information on maps and how they compare to other associative data structures in the language, please check the [Maps chapter in our new Getting Started guide](/getting-started/maps-and-dicts.html). Elixir Sips has also released two episodes that cover maps ([part 1](http://elixirsips.com/episodes/054_maps_part_1.html) and [part 2](http://elixirsips.com/episodes/055_maps_part_2.html)).
Developers can use the functions in the [`Map` module](/docs/stable/elixir/#!Map.html) to work with maps. For more information on maps and how they compare to other associative data structures in the language, please check the [Maps chapter in our new Getting Started guide](/getting-started/maps-and-dicts.html). Elixir Sips has also released two episodes that cover maps ([part 1](http://elixirsips.com/episodes/054_maps_part_1.html) and [part 2](http://elixirsips.com/episodes/055_maps_part_2.html)).

Maps also provide special syntax for creating, accessing and updating maps with atom keys:

Expand Down Expand Up @@ -185,7 +185,7 @@ For more information on structs, check out the [Structs chapter in the getting s

With the introduction of maps and structs, some deprecations will arrive on upcoming releases. First of all, the `ListDict` data structure is being deprecated and phased out. Records are also being deprecated from the language, although it is going to be a longer process, as many projects and Elixir itself still use records in diverse occasions.

Note though only Elixir records are being deprecated. Erlang records, which are basically syntax sugar around tuples, will remain in the language for the rare cases Elixir developers need to interact with Erlang libraries that provide records. In particular, the [Record](/docs/stable/elixir/Record.html) has been updated to provide the new Record API (while keeping the old one for backwards compatibility).
Note though only Elixir records are being deprecated. Erlang records, which are basically syntax sugar around tuples, will remain in the language for the rare cases Elixir developers need to interact with Erlang libraries that provide records. In particular, the [Record](/docs/stable/elixir/#!Record.html) has been updated to provide the new Record API (while keeping the old one for backwards compatibility).

Finally, structs are still in active development and new features, like `@derive`, should land in upcoming Elixir releases. For those interested, the [original maps and structs proposal is still availble](https://gist.github.com/josevalim/b30c881df36801611d13).

Expand Down Expand Up @@ -222,7 +222,7 @@ iex> for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>
"helloworld"
```

Sets, maps and other dictionaries can also be given with the `:into` option. In general, the `:into` accepts any structure as long as it implements the [`Collectable` protocol](/docs/stable/elixir/Collectable.html).
Sets, maps and other dictionaries can also be given with the `:into` option. In general, the `:into` accepts any structure as long as it implements the [`Collectable` protocol](/docs/stable/elixir/#!Collectable.html).

For example, the `IO` module provides streams, that are both `Enumerable` and `Collectable`. You can implement an echo terminal that returns whatever is typed into the shell, but in upcase, using comprehensions:

Expand Down Expand Up @@ -275,7 +275,7 @@ That said, in the next months we plan to:

* Integrate applications configuration (provided by OTP) right into Mix;
* Provide an Elixir logger that knows how to print and format Elixir exceptions and stacktraces;
* Properly expose the functionality provided by Applications, Supervisors, GenServers and GenEvents and study how they can integrate with Elixir. For example, how to consume events from GenEvent as a [stream of data](/docs/stable/elixir/Stream.html)?
* Properly expose the functionality provided by Applications, Supervisors, GenServers and GenEvents and study how they can integrate with Elixir. For example, how to consume events from GenEvent as a [stream of data](/docs/stable/elixir/#!Stream.html)?
* Study how patterns like tasks and agents can be integrated into the language, often picking up the lessons learned by libraries like [e2](http://e2project.org/erlang.html) and [functionality exposed by OTP itself](http://erlang.org/doc/man/rpc.html);
* Rewrite the Mix and ExUnit guides to focus on applications and OTP as a whole, rebranding it to "Building Apps with Mix and OTP";

Expand Down
Loading