Make function arguments positional or keyword

@mkborregaard: I just wanted to have that flexibility in case people would ask. I love Julia language, and I would like to give people no chance to discard the fact that this is an awesome language Thanks.

It’s not about the REPL or Atom. It is simply that there are two ways of defining a function:

f(x) = println(x)
# or
function f(x)
    println(x)
end

They are equivalent. But you tried a mix between the two, e.g. you tried something like this:

f(x)
   println(x)
end

That doesn’t work.

2 Likes

I’ve actually written a little package called RequiredKeywords.jl that implements this solution using a macro. You can use it like

julia> using RequiredKeywords

julia> @required_keywords f(x; y) = x*y
f (generic function with 1 method)

julia> f(2,y=2)
4

julia> f(2)
ERROR: Unassigned Keyword:  Required keyword y::Int64 not included.
Stacktrace:
 [1] f(::Int64) at ./REPL[5]:1

It also works for the longform function style definitions, and you can still specify types for the optional keyword arguments.

1 Like

@adamslc: Great. Thanks.

Just a quick question. When we write function this way, how do we handle function if the code lines extend multiple lines, but not s single one?
Thanks.

f(x) = (y = x + x; println(y))

@mkborregaard: OK. Thanks.

Or with begin… end

2 Likes

I think I saw somewhere that

f(x) = begin
    y = x + x
    println(y)
end

was deprecated as recommended style in favour of

function f(x)
    y = x + x
    println(y)
end

so I thought only the really compact format was recommended?

I don’t think the former was ever recommended style, but I don’t see anything wrong with it either. It can be nice for consistency if a file primarily contains pure functions defined from short form syntax. Scala encourages the = syntax for pure functions too, and I think that’s a good convention: it is weird to see foo!(x) = bar!(x) because mutation is not typically mathematically expressed in definitions.

1 Like

How could I reduce the length of my function definitions if I have multiple named arguments? For example, I want to do something like:

err = z -> throw(ArgumentError("missing x"))
f(;x::Int64=err) = x
f()

but this gives a method-not-found error.

I see that there are easier ways for v1 (i.e., just doing f(; x::Int)), but how could I do for v0.6?

EDIT: can do with

err() = throw(ArgumentError("missing x"))
f(;x::Int64=err()) = x
f()

Just use the Compat package and put @compat in front of the function declaration, and then you can use the Julia 1.0 syntax for required-keyword arguments.

3 Likes

3 posts were split to a new topic: Struct with fixed array sizes

A post was merged into an existing topic: Struct with fixed array sizes

Sorry to revive this. Using Compat 1.3.0, and Julia v0.6.4, I get the following error:

julia> using Compat
INFO: Recompiling stale cache file /homes/USER/.julia/lib/v0.6/Compat.ji for module Compat.

julia> Pkg.status("Compat")
 - Compat                        1.3.0

julia> @compat f(; x::Int64) = x
ERROR: syntax: invalid keyword argument syntax "x::Int64" (expected assignment)

julia> @compat function(; x::Int64)
           return x
       end
ERROR: syntax: invalid keyword argument syntax "x::Int64" (expected assignment)

What am I messing up?

Looks like a https://github.com/JuliaLang/Compat.jl/pull/586 — it didn’t handle the case of typed keyword arguments.

1 Like