Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add documentation and test for Val{T} #9540

Merged
merged 2 commits into from
Jan 2, 2015
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: 4 additions & 2 deletions NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ Library improvements

* The `randexp` and `randexp!` functions are exported ([#9144])

* A new `Val{T}` type allows one to dispatch on bits-type values ([#9452])

Deprecated or removed
---------------------
Expand All @@ -159,12 +160,12 @@ Deprecated or removed
`trunc{T<:Integer}(T,x)`, `floor{T<:Integer}(T,x)`, etc.. `trunc` is now
always bound-checked;`Base.unsafe_trunc` provides the old unchecked `itrunc`
behaviour ([#9133]).

* `squeeze` now requires that passed dimension(s) are an `Int` or tuple of `Int`s;
calling `squeeze` with an arbitrary iterator is deprecated ([#9271]).
Additionally, passed dimensions must be unique and correspond to extant
dimensions of the input array.


Julia v0.3.0 Release Notes
==========================
Expand Down Expand Up @@ -1140,3 +1141,4 @@ Too numerous to mention.
[#9261]: https://github.com/JuliaLang/julia/issues/9261
[#9271]: https://github.com/JuliaLang/julia/issues/9271
[#9294]: https://github.com/JuliaLang/julia/issues/9294
[#9542]: https://github.com/JuliaLang/julia/issues/9542
31 changes: 30 additions & 1 deletion doc/manual/types.rst
Original file line number Diff line number Diff line change
Expand Up @@ -692,7 +692,7 @@ surrounded by curly braces::
This declaration defines a new parametric type, ``Point{T}``, holding
two "coordinates" of type ``T``. What, one may ask, is ``T``? Well,
that's precisely the point of parametric types: it can be any type at
all (or an integer, actually, although here it's clearly used as a
all (or any bits type, actually, although here it's clearly used as a
type). ``Point{Float64}`` is a concrete type equivalent to the type
defined by replacing ``T`` in the definition of ``Point`` with
:class:`Float64`. Thus, this single declaration actually declares an
Expand Down Expand Up @@ -1243,6 +1243,35 @@ If you apply :func:`super` to other type objects (or non-type objects), a
julia> super((Float64,Int64))
ERROR: `super` has no method matching super(::Type{(Float64,Int64)})

"Value types"
-------------

As one application of these ideas, Julia includes a parametric type,
``Val{T}``, designated for dispatching on bits-type *values*. For
example, if you pass a boolean to a function, you have to test the
value at run-time:

.. doctest::

function firstlast(b::Bool)
return b ? "First" : "Last"
end

println(firstlast(true))

You can instead cause the conditional to be evaluated during function
compilation by using the ``Val`` trick:

.. doctest::

firstlast(::Val{true}) = "First"
firstlast(::Val{false}) = "Last"

println(firstlast(Val{true}()))

Any legal type parameter (Types, Symbols, Integers, floating-point numbers,
tuples, etc.) can be passed via ``Val``.

Nullable Types: Representing Missing Values
-------------------------------------------

Expand Down
4 changes: 4 additions & 0 deletions doc/stdlib/base.rst
Original file line number Diff line number Diff line change
Expand Up @@ -438,6 +438,10 @@ Types

Compute a type that contains the intersection of ``T`` and ``S``. Usually this will be the smallest such type or one close to it.

.. function:: Val{c}()

Create a "value type" instance out of ``c``, which must be an ``isbits`` value. The intent of this construct is to be able to dispatch on constants, e.g., ``f(Val{false}())`` allows you to dispatch directly to an implementation ``f(::Val{false})``, without having to test the boolean value at runtime.

Generic Functions
-----------------

Expand Down
10 changes: 10 additions & 0 deletions test/core.jl
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,16 @@ begin
@test is(g(a),a)
end

# dispatch using Val{T}
begin
local firstlast
firstlast(::Val{true}) = "First"
firstlast(::Val{false}) = "Last"

@test firstlast(Val{true}()) == "First"
@test firstlast(Val{false}()) == "Last"
end

# try/finally
begin
after = 0
Expand Down