Behavior of map function

I’ve been messing around with map and count for golfing purposes, and recently noticed this.

julia> map(i->print(i),[1,2,3,4])
12344-element Array{Nothing,1}:
nothing
nothing
nothing
nothing

julia> print(map(i->print(i),[1,2,3,4]))
1234[nothing, nothing, nothing, nothing]

How to explain that array of nothings there ?
Edit: Thanks to @jling and @bkamins, I understand both why the above is happening and how to (somewhat) avoid it

Originally, I was trying to evaluate the following function

a(k)=map((i,j)->count(l->l[mod(i+=j,31)+1]=='#',readlines(file)),-k,k)

at k=1,3,5,7, by doing map(a,[1,3,5,7]) but only the first value of k that I pass in the array prints the correct value, rest all produce 0.
Even if I try to evaluate a ‘normally’ as:

print("$(a(7)) and $(a(3))")

my second call always returns 0. Why is this happening ? (I’m on Julia 1.5.2 btw)

map allocates, print returns nothing, thus the result array.

1 Like

use foreach if you do not want to collect return values.

2 Likes

Thank you, that explains the test case’s behaviour.

But why is the second invocation of a always giving zero while the first invocation always gives the correct answer?

Edit: I get it, it’s because readlines exhausts the file after first invocation -_-

For golfing purposes, you can save a few strokes:

map(print,[1,2,3,4])

The first argument to map is a function. Your anonymous function i->print(i) is one function simply calling another.