By: Phillip David
Re-posted from: http://phrodod.github.io/blog/2014/09/21/using-blocks-in-julia/
Blocks, like lambdas, are a way of defining anonymous functions in Julia. This
post details how to write code that uses blocks. Let’s start with a canonical
1 2 3 4 5 6 7 8 9
In this example, I pass a function to the map function, which applies the
function supplied as the first argument to each element of the array passed as
the second argument. Here, the function simply doubles the values.
I can do this more simply by using a lambda here:
1 2 3 4 5 6
Here, the function is simply defined in-line. For a simple function, this is
fine. But if the function gets more complicated, the lambda form would
hide the connection between the array and the map call. Traditionally, that’s
when you’d create a separate function. But with Julia, we have another option.
The block allows you to provide the function between a
do and an
following the call to map. It looks like this:
1 2 3 4 5 6 7 8
Notice that in this example, the call to map looks like it only takes one
argument. But the block following the function call provides the function that
gets passed as the first argument. Note that the argument to the block gets
defined on the same line as the do statement, but the remaining portion of the
block goes on following lines until you reach the
By allowing blocks instead of allowing only simple lambda expressions, Julia
allows you to perform significant work inside the block. The most obvious
example is file manipulation. The open statement has a version that takes a
function as an optional first argument. If you call that version, the file is
opened, passes the file handle to the function, then closes the file at the
end. This allows the open function to take care of all of the nasty edge cases
like end of file, file read errors, etc, along with normal file activity. All
I need to do is to use the opened file handle.
1 2 3
In this case, my local variable within the
do block is
f, the file handle.
I then write some data to it. I don’t need to worry about closing the file
when I’m done, because I’m using the special form of the open statment. When
handling large files (too big to fit in memory), it’s often desirable to
process them a line or a few lines at a time. With the special open structure,
you can do this, yet still allow Julia to clean up behind you.