In lots (actually all I've ever used) of functional languages there is no distinction between a statement and an expression and the last value of each code block is the "return value" of the block. On the other hand languages not generally considered purely functional usually introduce this distinction.
As an example of what I'm talking about, the following python code prints None
:
def foo():
5 + 5
print(foo())
while the scheme code prints 10
(define (foo) (+ 5 5))
(display (foo))
Obviously I'm not interested in subjective answers of people who prefer one style to the other, but objective reasons.
To me it seems the distinction makes the grammar and implementation of the language more complicated (one less obvious example of this being the necessary exceptions in the c++ standard for templates and void types, or the introduction of "shortcut if statements", like ?
in c-influenced languages) without a real benefit - but most likely there's a reason why even new, modern languages still have this distinction.