In experiential programming, the concepts of learning to program are taught as a side-effect of solving a problem. This is sometimes called problem-based learning. The syntax of a language is introduced when it is needed to solve a problem. The novice programmer then obtains an understanding of how a particular piece of programming language syntax can be used in an algorithmic context. Consider a simple example which finds the median of a series of user-input numbers. In its simplest context, the problem involves three steps:
- Obtain the user-input numbers.
- Calculate the median value.
- Output the median to the user.
So first, we ask the user how many numbers they wish to enter.
println("How many numbers? ")
This introduces the most fundamental output device in Julia, the function println(). Next this piece of information has to be obtained from the user.
n = parse(chomp(readline()))
This seems more complicated, but it basically reads the line of input, “chomps” the <return> from the end, and then turns the input into a number.
Next, a storage medium is created to store the values entered. This vehicle is an array of numbers, in this case with zeros as starting values.
t = zeros(n)
Now a loop can be introduced to allow for the n numbers to be input.
for i=1:n t[i] = parse(chomp(readline())) end
The final part of the puzzle involves calculating the median value of this set, and outputting this value out to the user. This is relatively easy, using the function median().
m = median(t)
Now output it:
println("The median value = ", m)
This 8-line program works quite nicely and introduces some of the basic programming ideas:
- input from and output
- using a container to store more than one piece of data
- iterative structures called loops
- using a built in function, in this case a statistical function
There is no need at this point to discuss datatypes – the way the program has been written, all input numbers will be assumed to be float numbers¹. The great thing about this Julia program is the lack of things that can make life more complicated for a novice programmer. There are no objects, no datatypes, and no having to deal with memory, or formatting instructions for input/output statements.
println("How many numbers? ") n = parse(chomp(readline())) t = zeros(n) for index=1:n t[index] = parse(chomp(readline())) end m = median(t) println("The median value = ", m)
Yes, there are some words which will seem strange to novice programmers,i.e. parse and chomp. But, there are many other things that exist in other languages that are transparent here. Performing a median calculation in C would require building a function called median(). And unlike Python, (and C) where arrays begin at element 0, arrays in Julia begin at element 1… so an array with 10 elements is indexed from 1 to 10. Now this code could be easily modified so that median() is replaced with mean(), or var() (variance).
¹Experienced programmers may loathe this idea of using floating-point numbers as the default, but it does not harm anything and makes life way easier for the novice. They may also be troubled by the dynamic typing, but this takes away the problems associated with declaring the variables index for example.
Now this could be used as the jump off point for asking the novice to modify the code to add a feature like calculating the sum of the numbers, and outputting this to the user. (In Julia this is as easy as using the sum() function.