It's also efficient in that it runs very, very fast thanks to being compiled. The size of the compiled executables can be very small too, when you chose to use dynamic linking of the libraries. Choosing static linking comes with the advantage of not having to worry about installing library dependencies (beyond libc) where-ever you chose to run the resulting executables.
Also multiple returns. I find it hard to believe that nobody else thought of that, but it's just not something any other language has.
Can also accomplish the same in PHP by returning arrays and using list() syntax as the lvalue.
(college, student, type_ofcollege) = fn()
# php, fn() returns array list(college, student, type_ofcollege) = fn()
# go, fn() returns multiple values college, student, type_ofcollege := fn()
# lua, fn() returns multiple values college, student, type_ofcollege = fn()As for immutability, consider how in languages like javascript, some mental accounting has to take place over what is passed by reference, and what is passed by value. Any error in this accounting can cause big problems. A pure-functional approach really cuts that problem down to size. New values are returned, and parameters are unchanged.
We were a C# shop for a long while, but even with .Net Core and a Windows/azure heavy tech stack Python is just consistently better at getting things into production.
Dynamic types aren’t always the greatest though.